|
Wpisał doctor
|
|
Środa, 14. Marzec 2007 03:29 |
|
Data i Czas - klasa TDateTime
Jak przydatna jest znajomośc aktualnego znacznika czasu (ang. Timestamp) nikogo nie trzeba przekonywać. Przykładowe zastosowanie to sprawdzenie liczby dni pozostałych do wygaśnięcia licencji czy pomiar czasu wykonania się algorytmu. W tym artykule zajmiemy się możliwościami jakie daja klasa TDateTime.
Metoda Now(), zwraca aktualną datę i czas np. 2007-03-14 02:40:10
Metoda Time(), zwraca aktualny czas np. 02:41:17 {viewonly=registered} Aby wyświetlić znacznik czasu na Labelu czy wpisać do pola Edit należałoby go przekonwertować z formatu Time na format AnsiString metodą TimeToStr(TDateTime czas). To rozwiązanie ma wadę gdy konwertujemy czas zwracany metodą Now(), gdyż gubi się wtedy data a pozostaje tylko czas. Do konwersji daty na AnsiString używamy metody DateToStr(TDateTime data). Do konwersji znacznika czasu na AnsiString zawierającego datę i czas należy wykorzystać funkcję DateTimeToStr(TDateTime timestamp).
TDateTime czas = Now(); Label1->Caption = czas; Edit1->Text = czas;
|
TDateTime czas = Time(); Label1->Caption = TimeToStr(czas); Edit1->Text = TimeToStr(czas); |
Uzyskanie samej daty - wykorzystujemy metodę CurrentDate(). TDateTime data = TDateTime::CurrentDate(); Edit2->Text = DateToStr(data); np. 2007-03-14
Uzyskanie daty i czasu - metoda CurrentDateTime(). Uzyskany efekt podobny do Now(). TDateTime data = TDateTime::CurrentDateTime(); Edit2->Text = DateTimeToStr(data); np. 2007-03-14 02:49:29.
Uzyskanie samego czasu - metoda CurrentTime(). TDateTime data = TDateTime::CurrentTime(); Edit2->Text = TimeToStr(data); np. 02:51:56.
Uzyskanie numeru dnia tygodnia - metoda DayOfWeek().
TDateTime data = TDateTime::CurrentDateTime(); Edit2->Text = data.DayOfWeek(); Uwaga: pierwszym dniem tygodnia jest niedziela, i tak dla środy zwraca wartość 4.
Dekodowanie daty
Chcąc uzyskać nie całą datę ale np. tylko aktualny miesiąc należy skorzystać z funkcji void __fastcall DecodeDate(unsigned short* year, unsigned short* month, unsigned short* day). Funkcja ta oddziela z całego znacznika daty poszczególne składniki, tj. dzień, miesiąc i rok.
TDateTime data = TDateTime::CurrentDateTime(); WORD rok, miesiac, dzien; data.DecodeDate(&rok, &miesiac, &dzien); Label1->Caption = rok; Label2->Caption = miesiac; Label3->Caption = dzien;
Nawet jeśli chcemy wykorzystać tylko 1 składnik daty, musimy przygotować wskaĽniki do wszystkich elementów daty.
Dekodowanie czasu
Podobnie do dekodowania daty, rozbiciu na składniki podlega znacznik czasu czyli godziny, minuty, sekundy i milisekundy. Wykorzystujemy funkcję void __fastcall DecodeTime(unsigned short* hour, unsigned short* min, unsigned short* sec, unsigned short* msec).
TDateTime czas = TDateTime::CurrentDateTime(); WORD godzina, minuta, sekunda, milisekunda; czas.DecodeTime(&godzina, &minuta, &sekunda, &milisekunda); Label1->Caption = godzina; Label2->Caption = minuta; Label3->Caption = sekunda; Label4->Caption = milisekunda;// prawidlowy zapis = IntToStr(milisekunda);
Wyjaśnienia wymagają dwie kwestie: 1 - nie jest wymagana konwersja czasu na AnsiString, jedynie IntToStr(). 2 - stosuję typ zmiennych WORD (liczba 16 bitowa), jest on równoważny typowi unsigned short według starej konwencji zapisu (patrz dział zmienne).
Inne sposoby konwersji znacznika czasu na AnsiString
TDateTime data = TDateTime::CurrentDateTime(); Edit2->Text = data.DateTimeString();
TDateTime data = TDateTime::CurrentDate(); Edit2->Text = data.DateString();
TDateTime data = TDateTime::CurrentTime(); Edit2->Text = data.TimeString(); {/viewonly}
|
|
LAST_UPDATED2 |