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.
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
Rozumiem, ze miales na mysli 8 bajtow (64-bity) :P
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.
Podoba mi sie ten cytat z wikipedii:
Sprawa naglaca :P