2012-03-02 01:30:49 +08:00
|
|
|
module Zip
|
|
|
|
class DOSTime < Time #:nodoc:all
|
2015-03-24 00:06:01 +08:00
|
|
|
# MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
|
2012-02-01 18:08:26 +08:00
|
|
|
|
2012-03-02 01:30:49 +08:00
|
|
|
# Register CX, the Time:
|
|
|
|
# Bits 0-4 2 second increments (0-29)
|
|
|
|
# Bits 5-10 minutes (0-59)
|
|
|
|
# bits 11-15 hours (0-24)
|
2012-02-01 18:08:26 +08:00
|
|
|
|
2012-03-02 01:30:49 +08:00
|
|
|
# Register DX, the Date:
|
|
|
|
# Bits 0-4 day (1-31)
|
|
|
|
# bits 5-8 month (1-12)
|
|
|
|
# bits 9-15 year (four digit year minus 1980)
|
2011-11-18 04:53:04 +08:00
|
|
|
|
2012-03-02 01:30:49 +08:00
|
|
|
def to_binary_dos_time
|
2015-03-23 01:03:50 +08:00
|
|
|
(sec / 2) +
|
2013-06-03 02:33:03 +08:00
|
|
|
(min << 5) +
|
|
|
|
(hour << 11)
|
2012-03-02 01:30:49 +08:00
|
|
|
end
|
2004-01-30 23:07:56 +08:00
|
|
|
|
2012-03-02 01:30:49 +08:00
|
|
|
def to_binary_dos_date
|
2017-06-29 10:57:12 +08:00
|
|
|
day +
|
2013-06-03 02:33:03 +08:00
|
|
|
(month << 5) +
|
|
|
|
((year - 1980) << 9)
|
2012-03-02 01:30:49 +08:00
|
|
|
end
|
2004-01-30 23:07:56 +08:00
|
|
|
|
2012-03-02 01:30:49 +08:00
|
|
|
def dos_equals(other)
|
2020-11-29 05:19:58 +08:00
|
|
|
warn 'Zip::DOSTime#dos_equals is deprecated. Use `==` instead.'
|
|
|
|
self == other
|
|
|
|
end
|
|
|
|
|
|
|
|
# Dos time is only stored with two seconds accuracy.
|
|
|
|
def <=>(other)
|
|
|
|
(to_i / 2) <=> (other.to_i / 2)
|
2012-03-02 01:30:49 +08:00
|
|
|
end
|
2004-01-30 23:07:56 +08:00
|
|
|
|
2019-10-07 03:01:14 +08:00
|
|
|
# Create a DOSTime instance from a vanilla Time instance.
|
|
|
|
def self.from_time(time)
|
|
|
|
local(time.year, time.month, time.day, time.hour, time.min, time.sec)
|
|
|
|
end
|
|
|
|
|
2020-02-19 15:28:46 +08:00
|
|
|
def self.parse_binary_dos_format(bin_dos_date, bin_dos_time)
|
|
|
|
second = 2 * (0b11111 & bin_dos_time)
|
|
|
|
minute = (0b11111100000 & bin_dos_time) >> 5
|
|
|
|
hour = (0b1111100000000000 & bin_dos_time) >> 11
|
|
|
|
day = (0b11111 & bin_dos_date)
|
|
|
|
month = (0b111100000 & bin_dos_date) >> 5
|
|
|
|
year = ((0b1111111000000000 & bin_dos_date) >> 9) + 1980
|
2012-03-02 01:30:49 +08:00
|
|
|
begin
|
2015-03-23 00:30:24 +08:00
|
|
|
local(year, month, day, hour, minute, second)
|
2012-03-02 01:30:49 +08:00
|
|
|
end
|
2004-01-30 23:07:56 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
|
|
|
# rubyzip is free software; you can redistribute it and/or
|
|
|
|
# modify it under the terms of the ruby license.
|