Vollständige Version anzeigen : .dbf (dBase) Timestamp konvertieren


Prrovoss
17.11.2013, 01:20

hi,
ich sitze gerade an einer für mich bisher unlösbaren aufgabe :D ich will eine ;dbf datei in eine mysql datenbank überführen. das wäre soweit kein problem, wenn der timestamp(welcher für mich wichtig ist) nicht in so einem kryptischen format wäre... :

41594;722222222 - 16;11;2013, 17:20 3472222
41594;725694444 - 16;11;2013, 17:25 3472223
41594;729166667 - 16;11;2013, 17:30 3472222
41594;732638889 - 16;11;2013, 17:35 3472222
41594;736111111 - 16;11;2013, 17:40 3472222
41594;739583333 - 16;11;2013, 17:45 3472223
41594;743055556 - 16;11;2013, 17:50 3472222
41594;746527778 - 16;11;2013, 17:55 3472222
41594;75 - 16;11;2013, 18:00 3472222
41594;753472222 - 16;11;2013, 18:05 3472222
41594;756944444 - 16;11;2013, 18:10 3472223
41594;760416667 - 16;11;2013, 18:15
41594;763888889 - 16;11;2013, 18:20
41594;767361111 - 16;11;2013, 18:25
41594;770833333 - 16;11;2013, 18:30
41594;774305556 - 16;11;2013, 18:35
41594;777777778 - 16;11;2013, 18:40
41594;78125 - 16;11;2013, 18:45
41594;784722222 - 16;11;2013, 18:50


das links sind die timestamps, wie sie in der dbf datei stehen und nach dem bindestrich dann das dazugehörige datum+uhrzeit. das ganz rechts habe ich mir nur mal notiert, das ist immer die differenz zwischen zwei timestamps (also 5 minuten).

auf dieser seite habe ich schon einen hinweis gefunden:
dBASE ;DBF File Structure (;;;dbase~com/Knowledgebase/INT/db7_file_fmt;htm)
8 bytes - two longs, first for date, second for time. The date is the number of days since 01/01/4713 BC. Time is hours * 3600000L + minutes * 60000L + Seconds * 1000L

das kommt schonmal ungefähr hin, nur dass meine timestamps keine 8 byte lang sind^^
wenn es dann allerdings an das tatsächliche umrechnen geht, komme ich nichtmehr weiter... wenn ich die zahl vor dem Punkt in jahre umwandel, kommen da 115 jahre raus, was quatsch ist.
und für das umwandeln der zeit habe ich noch weniger ideen, da ich garnicht weiss, wie ich so eine berechnung, wie sie da beschrieben wird rückgängig machen kann^^

jemand eine idee? ich habe inzwischen schon bestimmt 4 libraries ausprobiert, die auch alle funktionieren, allerdings wandelt mir keine diesen timestamp in ein ordentliches format um, da die der fieldType für alle felder in der dbf datei Numeric ist und die meisten libs so eine funktion garnicht erst implementieren, sondern einfach nur stumpf die daten auslesen können^^

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Kolazomai
17.11.2013, 09:02

Hallo Prrovoss!

Bezüglich des Datums würde mir ein Workaround einfallen. Du weisst, dass der 16;11;2013 41594 ist. Wenn du eine neue Zahl bekommst, z;B. 43211, dann kannst du die Differenz zwischen 41594 und 43211 berechnen. Das sind (wahrscheinlich) die Tage zwischen dem 16;11;2013 und dem anderen Datum. Danach wandelst du den 16;11;2013 in ein bekanntes Timestamp-Format um und addierst bzw. subtrahierst die Tage. Am Ende hast du als Ergebnis das neue Datum.

Bezüglich der Zeit hast du ja das Delta:
Delta(Zeit) = Delta(Einheiten)
5 Minuten = (3472223 + 3472222) / 2 Einheiten
1 Minute = 69444;5 Einheiten


Du kannst jetzt die HH:MM nach Minuten umrechnen und mit dem Ergebnis der Rechnung oben multiplizieren. Das Ganze würde natürlich auch auf Sekundenbasis gehen.

Leider wirst du wegen der Gleitkommazahl und den unterschiedlichen Deltas (372223 und 372222) wohl Probleme mit der Genauigkeit kriegen. Das könnte man vielleicht noch ausbügeln, wenn man ein Schema voraussetzt (z;B. jede Stunde wird um X Einheiten korrigiert). Die Zeit ist kein so einfaches Thema.

Mfg,

Kolazomai


Prrovoss
17.11.2013, 12:49

hi,
danke schonmal für die antwort, aber es scheint, als ob meine ganzen anstrengungen diesen timestamp zu verstehen überflüssig waren, da die doku von dbase einfach falsch ist :D :
dBASE Web-News v;1;6;3 (;;;alldbase~com/dbasenews/newsgroups;php?art_group=dbase;how-to&article_id=4046)

It is a little surprising that nobody has noted before, that the description of
the Timestamp field in the document "Data File Header for the dBase Version 7
Table File" is not correct;


auf der seite wird ein php code gegeben, der mir so einen timestamp in ein normales format umwandelt.
leider hab ich mich mit php noch überhaupt nie beschäftigt und habe diesen code daher nich zum laufen gekriegt^^

gibt es hier jemanden, der mir grob den quelltext übersetzen kann? ich bräuchte das ganze in java, aber mit dem unixTimestamp komm ich nich ganz klar^^
ich hab schonmal versucht das per hand nachzurechnen, aber ich bin nich so wirklich auf ein brauchbares ergebnis gekommen :/


Ähnliche Themen zu .dbf (dBase) Timestamp konvertieren
  • eingabeaufforderung mit timestamp?
    hi also wie ioben schon steht würde ich gerne wissen ob es das überhaupt gibt das in der eingabeaufforderung die izeit vor der zeile steht, so wie im irc oder flashfxp wenn ja , wäre echt nett wenn mir das wer erklären könnte cya [...]

  • [PHP] Timestamp Problem
    Moinsen! Auch auf die gefahr hin das es ne Meta-Frage ist, ich habs nicht geschafft (aber durchaus intensiv probiert) mir die Lösung selbst anzueignen... Ich habe ein Formular in das man ein Datum eingibt, anschliessend wir das datum in einen timestamp umgewandelt und mit einem vorgegeben timesta [...]

  • [C/C++] Timestamp
    Hi, ich habe folgendes Problem: Ich möchte einen Unixtimestamp unter C erstellen. Jedoch nicht für die Aktuelle Zeit, sondern z;B. für den 04;10;1987. Leider hab ich nur herausgefunden wie man einen Timestamp für die aktuelle Zeit bekommt. Würde mich sehr über Hilfen und Anregungen freuen. [...]

  • [Visual Basic] Dbase code zu exe compilen
    Hi leute wir benutzen auf der arbeit dbase für unsere Zeiterfassung usw. leider funktioniert dbase auf den neuen win7 64bit rechnern nichtmehr so wie es soll. habe den source code der *;PRG programme sind soweit ich das rausgefunden hab in der programmiersprache clipper geschrieben. i [...]



raid-rush.ws | Imprint & Contact pr