Convert TDateTime to Unix TimeStamp

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.

6 przemyśleń nt. „Convert TDateTime to Unix TimeStamp”

  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. 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.

  3. 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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *