Convert TDateTime to Unix TimeStamp

23 lipca 2007

O tym, że „gardzę” językami pascalowatymi i nie lubię Borlanda niektórzy pewnie wiedzą. Żyjemy sobie w błogiej świadomości, że nie będziemy mieć żadnej styczności z Delphi, czy wymysłami Borlanda, a tu nagle krach. Otrzymywane dane z jakiegoś źródła, bądź dane wysyłane musza być zapisane w nad wyraz pięknym formacie TDateTime.

Zabić to mało…

Na szczęście można w łatwy sposób przekonwertować dziwny format TDateTime (8 bajtów) na coś bardziej ludzkiego – unixowy timestamp (4 bajty).

TDateTime – borlandowski typ służący do przechowywania daty i czasu, który upłynął od 30 grudnia 1899 roku. Jest to nic innego jak typ double, gdzie część całkowita określa date (liczbę dni od 30 grudnia 1899 roku), a ułamkowa określa czas.

type TDateTime = type Double;

Unix TimeStamp – uniksowy znacznik czasu, 32-bitowa zmienna typu całkowitego ze znakiem zawierająca liczbę sekund, które upłynęły od rozpoczęcia epoki uniksowej, czyli od 1 stycznia 1970, godz. 0:00.

Konwersja nie jest taka trudna jakby się mogło wydawać na początku. Wystarczy od TDateTime odjąć offset miedzy 30 grudnia 1899 a 1 stycznia 1970, a wynik pomnożyć przez ilość sekund doby. I otrzymamy liczbę sekund od 1970 ;)

W sieci można znaleźć kilka podobnych rozwiązań.

Poniżej trochę kodu. Funkcje najlepiej deklarować jako inline.

#include <math.h>
 
inline int TDateTime2UnixTimeStamp(double datetime) {
	return (int) round((datetime - 25569.0) * 86400);
}
 
inline double UnixTimeStamp2TDateTime(int timestamp) {
	return (timestamp / 86400) + 25569.0;
}

W przypadku problemów z round, wynikających z starszych implementacji sprzed standardu C99, można użyć funkcji ceil.

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Komentarze i nawiązania (5)

Kanał RSS komentarzy

  1. Osobiście kiedyś pisałem w BCB, jednak od kilku dobrych lat bierze mnie wielka niechęć do ichniejszych rozwiązań.

    Sam sposób zapisywania daty to porażka, chociaż ostatnio POSIX przeszedł na 8 bitowy zapis daty, z powodu kończenia się limitu zmiennej. Porada na pewno się przyda

  2. Rozumiem, ze miales na mysli 8 bajtow (64-bity) :P

  3. Dokładnie, trochę źle mi się to napisało. Ale wiadomo o co chodzi. na szczęście kolejnego powiększenia wielkości tej zmiennej już nie doczekamy.

  4. Podoba mi sie ten cytat z wikipedii:

    Zapobiec mu może przejście na 64-bitową reprezentację czasu (typ time_t), dla której analogiczny problem pojawi się dopiero w roku 292 277 026 596 (czyli za około 292 miliardy lat) – nie będzie to jednak sprawa nagląca.

    Sprawa naglaca :P

  5. [...] TDateTime type conversion http://blog.malcom.pl/2007/07/23/con…nix-timestamp/ The function is not in php but I’m sure you can convert [...]

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)