Class | Ole::Types::FileTime |
In: |
lib/ole/types/base.rb
|
Parent: | DateTime |
SIZE | = | 8 |
EPOCH | = | new 1601, 1, 1 |
time should be able to be either a Time, Date, or DateTime.
# File lib/ole/types/base.rb, line 84 84: def self.dump time 85: # i think i'll convert whatever i get to be a datetime, because of 86: # the covered range. 87: return 0.chr * SIZE unless time 88: time = time.send(:to_datetime) if Time === time 89: # don't bother to use const_get here 90: bignum = (time - EPOCH) * 86400 * 1e7.to_i 91: high, low = bignum.divmod 1 << 32 92: [low, high].pack 'V2' 93: end
Create a DateTime object from a struct FILETIME (msdn2.microsoft.com/en-us/library/ms724284.aspx).
Converts str to two 32 bit time values, comprising the high and low 32 bits of the 100‘s of nanoseconds since 1st january 1601 (Epoch).
# File lib/ole/types/base.rb, line 67 67: def self.load str 68: low, high = str.to_s.unpack 'V2' 69: # we ignore these, without even warning about it 70: return nil if low == 0 and high == 0 71: # switched to rational, and fixed the off by 1 second error i sometimes got. 72: # time = EPOCH + (high * (1 << 32) + low) / 1e7 / 86400 rescue return 73: # use const_get to ensure we can return anything which subclasses this (VT_DATE?) 74: const_get('EPOCH') + Rational(high * (1 << 32) + low, 1e7.to_i * 86400) rescue return 75: # extra sanity check... 76: #unless (1800...2100) === time.year 77: # Log.warn "ignoring unlikely time value #{time.to_s}" 78: # return nil 79: #end 80: #time 81: end