binary long Dieses binäre Datumsformat gesehen?



unix timestamp milliseconds (4)

30. September 2008

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

1. Oktober 2008

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

Es ist jedermanns Vermutung, wofür die restlichen 15 Ein-Bits sind.

EDIT: by top 5 Bits meine ich:

day_of_month = (value >> 15) & 0x1f

Ähnlich:

year = (value >> 24) & 0xff + 1900
month = (value >> 20) & 0x0f

3/10/2008 = 1822556159

2/10/2008 = 1822523391

1/10/2008 = 1822490623

30/09/2008 = 1822392319

29/09/2008 = 1822359551

Das sind alle Informationen, die ich zur Zeit kenne.

Datumsangaben werden um 32768 erhöht, außer wenn der Monat geändert wird, wenn das Inkrement 32768 x 2 (65536) beträgt.

Hat jemand dieses binäre Datumsformat gesehen und wie kann ich das korrekte Datum extrahieren?

Es ist möglich, dass der verbleibende Teil des Datums für die Zeit (Stunden, Minuten, Sekunden) ist


Answer #1

schreibe es in einem binären Format auf:

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

wo 1101100 108 ist, wie Alnitak sagte, der Rest ist Monat (1010 oder 1001) und Tage.

Die 1s am Ende können für die Darstellung von Sekunden / Millisekunden reserviert werden.


Answer #2

32768 ist 2 ^ 15; Sie reservieren 15 Bits für die Tage, die ich glaube nicht, dass sie sich in eine nützliche Kombination aus Stunden, Minuten und / oder Sekunden teilen.


Answer #3

EDIT: Alnitak ist richtig, dass dies eine binäre Datumsrepräsentation ist. Die Prinzipien können jedoch ähnlich wie nachfolgend beschrieben sein; anstelle einer Dezimalstelle ist das Format fest und die unteren 15 Bits sind höchstwahrscheinlich die Zeit. Wenn Sie Beispiele haben, schreiben Sie diese und wir werden versuchen zu helfen.

ORIGINAL: Dies ist höchstwahrscheinlich das Windows OLE / COM-Datumsformat, das ein Double verwendet, um ein Datum und eine Uhrzeit darzustellen. Der ganzzahlige Teil der Nummer ist für das Datum und der Bruch ist für die Zeit. Es kann Daten zwischen 1. Januar 100 und 31. Dezember 9999 darstellen. Weitere Informationen finden Sie unter MSDN oder google für OLE-Datum COM double.

Bearbeiten: Hier ist ein C # -Beispiel mit DateTime.FromOADate. Hier ist ein wenig mehr Details von MSDN VariantTimeToSystemTime .

Eine variante Zeit wird als ein 8-Byte-realer Wert (doppelt) gespeichert, der ein Datum zwischen dem 1. Januar 1753 und dem 31. Dezember 2078 einschließlich darstellt.

Der Wert 2.0 repräsentiert den 1. Januar 1900; 3.0 steht für den 2. Januar 1900 und so weiter.

Wenn Sie dem Wert 1 hinzufügen, wird das Datum um einen Tag erhöht. Der Bruchteil des Wertes repräsentiert die Tageszeit. Daher steht 2,5 am Mittag des 1. Januar 1900; 3.25 steht für 6.00 Uhr am 2. Januar 1900 und so weiter.

Negative Zahlen repräsentieren die Daten vor dem 30. Dezember 1899.

Dies ist ein wenig widersprüchlich, da die COleDateTime- Dokumentation besagt, dass es den 1. Januar 100 unterstützt, während diese Dokumentation besagt, dass es den 1. Januar 1753 unterstützt.

Es gibt Schnittstellen für VB (verwenden Sie CDbl () und CDate ()), C # (DateTime.FromOADate / ToOADate), Java ( OLEDate - sieht jedoch veraltet aus), Delphi , Python usw.