php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Datum in Binary abgelegt, wie kann ich es wieder convertieren?


 
Oldfellow
04-09-2006, 12:23 
 
Hallo,

ich habe hier eine Datenbank in der der Zeitstempel binär abgelegt ist.
Wenn ich die Tabelle in Excell extrahiere bekomme ich z.B. folgendes Datum:

01C6C57CA9B84440

Wie kann ich diese Information wieder in ein richtiges Datum umwandeln?

Der obere Hexcode sollte etwa den 22.08.06 1:51:04 AM ergeben.

Aber wie funktioniert das?

Vielen Dank!

 
ghostgambler
04-09-2006, 21:03 
 
Wie sind die Timestamps denn zu binären Strings geworden? (Und warum überhaupt Oo,)

 
ArSeN
04-09-2006, 21:23 
 
Ehm häääh?

Das sind nie und nimmer Binärdaten. Binär --> Zweizuständig

also entweder 1 oder 0.

Da gibts keine Buchstaben drinne.

Wenn dann sind das Hexdezimaldaten, aber auch das glaube ich nicht. Finde erstmal raus was für eine Zahl es ist und dann sag uns nochmal bescheid ;)

 
penizillin
05-09-2006, 02:51 
 
:dontknow:
01C6C57CA9B84440 in hex entspricht
128006778640680000 in dec, wenn der win-calc nicht lügt.
und das ist kein timestamp.

werd mal konkreter. was steht in der tabelle? von welchem typ ist die spalte? wie kommt sie nach excel? was passiert dort?

 
Oldfellow
05-09-2006, 09:22 
 
Hallo,

also die Spalte hat den Typ Binary, Size: 8

Wenn ich die Tabelle öffne bekomme ich in den Spalten auch nur <binary> angezeigt.

Ich habe die Tabelle mittels DataExport nach Excel exportiert, und da bekomme ich dann diesen Hex-String.

Die Daten in der Tabelle sind Ereignisse die Protokoliert wurden, wenn ich mir den ExcelExport ansehe, erkenne ich schon das, mit voran schreitendem Zeitpunkt der Ereignisse die Hexzahl größer wird, ich kann nur nicht erkennen welches System dahinter steckt.

Wie der Timestamp zu diesem Hexcode geworden ist kann ich leider nicht nachvollziehen, da das Programm, welches in die Datenbank schreibt, nicht von mir ist.

Hoffe ihr könnt mich jetzt eher verstehen.

 
sternm
05-09-2006, 11:25 
 
Die Formel um einen unix timestamp in ein Datum/Zeit zu verwandeln, lautet:
=(x+((365*66+17)*86400))/86400 (siehe Google: excel unix timestamp). Um hex in dez zu verwandeln, gibt es die Funktion HEXINDEZ("maximal 40 bits") (siehe Excel-Hilfe). Aber heute ist etwa time= 1157444143, in hex 44FD322F . Du hast eine 64bit Zahl angegeben das ist kein üblicher timestamp. Um das System zu erkennen, müsste man einige Werte mit dem zugehörigen Datumswert haben.

 
ministry
05-09-2006, 14:04 
 
Hast du mal noch ein paar von diesen codierten Daten?

Mit Angabe, wo sie ungefähr landen sollen (also, mindestens, welches Jahr sie darstellen).

 
onemorenerd
05-09-2006, 14:53 
 
<?php
$mystery = '01C6C57CA9B84440';
$formats = array('h','H','s','S','n','v',
'i','I','l','L','N','V','f','d');

foreach ($formats as $f) {
echo '<b>'.$f.'</b><br />';
foreach (unpack($f.'*', $mystery) as $v)
echo date('r', $v).'<br />';
}
?>
Ist da was dabei?

 
Oldfellow
05-09-2006, 17:22 
 
Hallo,

hier noch ein paar Paare:

01C67D32B5E29500
=
22.05.2006 2:00:18 AM


01C67D336251F420
=
22.05.2006 2:05:07 AM


01C67D53113C9B60
=
22.05.2006 5:51:55 AM


01C693F7A49A5220
=
20.06.2006 1:25:25 AM


01C6A6CF8E268CD0
=
14.07.2006 12:56:19 AM

Sorry aber mit dem letzten Beitrag kann ich leider gar nichts anfangen.

 
ministry
05-09-2006, 18:46 
 
Also, ich hatte gerade mal Langeweile. Des Rätsels Lösung:

In dezimal umwandeln und durch 10000000 teilen und dann (warum auch immer) 134774 Tage davon abziehen.


$coded = array('01C67D32B5E29500', '01C67D336251F420',
'01C67D53113C9B60', '01C693F7A49A5220', '01C6A6CF8E268CD0');

foreach($coded as $c) {
echo(date("d.m.Y H:i:s A", (hexdec($c) / 10000000) - (134774*24*60*60)) . "<br>");
}


Falls einer weiß, was das nun für ein Format sein soll, mich würde es mittlerweile interessieren :confused: :)

gruß,
ministry

 
ArSeN
05-09-2006, 19:15 
 
Hmmmm.. also auf jeden Fall hast du dir meinen Respekt damit verdient das du auf sone kranke Lösung kommst :D

Ich versuch mal 'ne Erklärung:

Der normale UNIX-Timestamp zählt ja die Sekunden vom 01.01.1970 um genau 1:00 morgens.

Da du nun rausgefunden hast, wie man das ganze berechnet mit dem komischen code, gehe ich folgerlich von folgendem aus: Die Zeitrechnung des Timestamps von Oldfellow beginnt erst 369,24383561643835616438356164384 Jahre (bzw. 134774 Tage) später als die vom UNIX-Timestamp. Dann bleibt noch das durch 10000000 teilen. Soweit ich weiß is das mit der gegeben Anzahl Nullen dort 10 Millionen. Eine Millionstel-Sekunde ist außerdem eine sog. Mikro-Sekunde.

Schlussfolgerung: Die Zeitrechnung wird also (außer das sie erst in ca. 340 Jahren beginnt) in 10mikrosekunden gemessen, anstatt in Sekunden.

Is doch unheimlich logisch oder? :rocks:

 
ministry
05-09-2006, 19:38 
 
So, du hast mich jetzt drauf gebracht. Google-Suche nach "134774 days" sagt auch schon was, und zwar u.a.:

Windows, however, is another story. Windows XP certainly has available a good implementation of NTP (how to install it), which will get the system time set accurately as we require (note that Windows XP has a built-in SNTP client, which can be set to run periodically in order to provide roughly-accurate time sufficient for typical home use). And the GetSystemTimeAsFileTime() call returns the current time in hectonanoseconds (100-nanosecond units) since 1601-01-01T00:00:00Z (11644473600 seconds before the start of the Unix epoch on 1970-01-01T00:00:00Z). Isn't this enough?

http://www.lochan.org/2005/keith-cl/useful/win32time.html#timingwin

Also wäre das ein hexadezimal gespeicherter Windows-Timestamp, der übrigens in Hektonanosekunden gemessen wird und dessen Zählung schon am 01.01.1601 beginnt :goth:.

Naja, hätten wir das geklärt :D

 
ArSeN
05-09-2006, 20:02 
 
Hektonanosekunde = 10Mikrosekunden

das ganze is echt krank :goth:

 
onemorenerd
05-09-2006, 23:24 
 
Und allem ist der Entwickler der Software schuld, welche diese Timestamps erzeugt. Selbst wenn er wegen OS-Abhängigkeit etc. keine andere Wahl hatte, als dieses Format zu nehmen, so hätte er das wenigstens ordentlich dokumentieren müssen!

 
ghostgambler
06-09-2006, 00:47 
 
Original geschrieben von onemorenerd
Und allem ist der Entwickler der Software schuld, welche diese Timestamps erzeugt. Selbst wenn er wegen OS-Abhängigkeit etc. keine andere Wahl hatte, als dieses Format zu nehmen, so hätte er das wenigstens ordentlich dokumentieren müssen!
(na ich denke mal der TO hat keinen Zugriff auf den Code, oder? Sonst hätte man da ja mal einen Blick reinwerfen können und wäre wahrscheinlich von selbst drauf gekommen ... und in ein Manual würde ich auch nicht schreiben wie das Timestamp-Format in der Datenbank ist :rolleyes: )

 
Oldfellow
06-09-2006, 08:13 
 
Des Rätsels Lösung!

Was mich nur wundert, ich komm nicht auf mein anvisiertes Datum!

1C6A6CF8E268CD0 (H) = 127973049799970000 (D) oder?

(127973049799970000 / 10000000 / 24 / 60 / 60) - 134774 =

13342,95578700230

Und laut meinem Excel entspricht das dem

11.7.1936 22:56:20

dabei sollte das doch im Jahr 2006 sein. Oder irre ich mich??

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:33 Uhr.