Видели этот двоичный формат даты? - PullRequest
3 голосов
/ 10 ноября 2008

3/10/2008 = 1822556159

2/10/2008 = 1822523391

1/10/2008 = 1822490623

30/09/2008 = 1822392319

29/09/2008 = 1822359551

Это вся информация, которую я знаю в настоящее время.

Увеличение даты на 32768, за исключением случая изменения месяца, когда увеличение составляет 32768 x 2 (65536).

Кто-нибудь видел этот двоичный формат даты и как я могу извлечь правильную дату?


Возможно, что оставшаяся часть даты предназначена для времени (часы, минуты, секунды)

Ответы [ 4 ]

9 голосов
/ 10 ноября 2008

30 сентября 2008

1822392319 = 0x6c9f7fff
0x6c = 108 = 2008 (based on 1900 start date)
0x9 = 9 = September
0xf7fff - take top 5 bits = 0x1e = 30

1 октября 2008

1822490623 = 0x6ca0ffff
0x6c = 108 = 2008
0xa = 10  = October
0x0ffff  - take top 5 bits = 0x01 = 1

Кто-то догадывается, для чего нужны оставшиеся 15 однобитных, если что.

РЕДАКТИРОВАТЬ: под старшими 5 битами я имею в виду:

day_of_month = (value >> 15) & 0x1f

Аналогично:

year = (value >> 24) & 0xff + 1900
month = (value >> 20) & 0x0f
2 голосов
/ 10 ноября 2008

РЕДАКТИРОВАТЬ: Alnitak правильно, что это двоичное представление даты с фиксированной точкой. Однако принципы могут быть аналогичны тем, что описаны ниже; вместо десятичного разряда формат фиксируется, и младшие 15 бит, скорее всего, являются временем. Если у вас есть примеры, опубликуйте их, и мы постараемся помочь.

ORIGINAL: Скорее всего, это формат даты Windows OLE / COM, который использует Double для представления даты и времени. Целая часть числа - для даты, а дробь - для времени. Он может представлять даты между 1 января 100 года и 31 декабря 9999 года. Дополнительную информацию можно найти по адресу MSDN или в Google для OLE date COM double.

РЕДАКТИРОВАТЬ: Вот один C # пример с использованием DateTime.FromOADate. Вот немного больше информации из MSDN VariantTimeToSystemTime .

Вариант времени хранится в виде 8-байтового действительного значения (double), представляющего дату между 1 января 1753 года и 31 декабря 2078 года включительно.

Значение 2,0 представляет 1 января 1900 года; 3.0 соответствует 2 января 1900 года и т. Д.

Добавление 1 к значению увеличивает дату на день. Дробная часть значения представляет время суток. Таким образом, 2,5 представляет полдень на 1 января 1900 года; 3,25 представляет 6:00 утра 2 января 1900 года и т. д.

Отрицательные числа представляют даты до 30 декабря 1899 г.

Это немного противоречиво, поскольку в документации COleDateTime говорится, что она поддерживает 1, 100 января, тогда как в этой документации говорится, что она поддерживает 1 января 1753 года.

Есть интерфейсы для VB (используйте CDbl () и CDate ()), C # (DateTime.FromOADate / ToOADate), Java ( OLEDate - выглядит устаревшим), Delphi Python и т. Д.

2 голосов
/ 10 ноября 2008

запишите в двоичном формате:

a = 1822556159
1101100 1010 00011 111111111111111
b = 1822523391
1101100 1010 00010 111111111111111
c = 1822490623
1101100 1010 00001 111111111111111
d = 1822392319    
1101100 1001 11110 111111111111111

, где 1101100 - 108, как сказал Альнитак, остальное - месяц (1010 или 1001) и дни.

1 в конце могут быть зарезервированы для представления секунд / миллисекунд.

0 голосов
/ 10 ноября 2008

32768 - 2 ^ 15; они резервируют 15 битов на дни, которые, я не думаю, делятся поровну на любую полезную комбинацию часов, минут и / или секунд.

...