Bug w reprezentacji czasu - Delphi 2005

0

Aby przedstawić godzinę, to tak naprawdę potrzebujemy ilości sekund(tj. 5 cyfr po przecinku - zakładamy, że nie bawimy się w milisekundy).

Okazuje się, że czasami godzina np: 15:00:00 może być reprezentowana jako:
0,625005
a czasem nawet:
0,625011

(godzina brana z komponentu DateTimePicker)

Teoretycznie różnicy nie ma. W praktyce jest i to o całą sekundę. Czemu? Ponieważ, jeśli zamienimy drugi przykład na czas Unixowy za pomocą DateTimeToUnix, to uzyskamy już czas zwiększony o jedną sekundę.

Innymi słowy:
UnixToDateTime(dateTimeToUnix(0.625011)) <> 0.625011

Dlaczego tak się dzieje i czy można temu zaradzić w prosty sposób - bez używania decode/encodeDateTime?

0

Dlaczego tak się dzieje

BIOS liczy czas w jeden sposób, a zarówno Windows jak i Linux korzystają z clocka wbudowanego w komputer. Więc z tego co się orientuję różnicy nie ma. (Ale patrz dygresję)

czy można temu zaradzić w prosty sposób - bez używania decode/encodeDateTime?

Oczywiście! Olej jedną sekundę?

Dygresja: To tak jak z zaokrągleniami typów zmiennoprzecinkowych, BIOS nie ma nieskończonej precyzji, i potrafi troche oszukiwać. Tak samo Windows i Linux mają swoje 'profesjonalne' rozwiązania w kwerstii zaokrąglania czasu które powodują tą różnice (albo tak ci się wydaje mimo że jej nie ma).

EDIT:

Okazuje się, że czasami godzina np: 15:00:00 może być reprezentowana jako:
0,625005
a czasem nawet:
0,625011

A to przypadkiem nie jest z milisekundami? =.=

0

Objawię ci straszną prawdę: od 00:00 1 stycznia 1970 roku, a od tej chwili czas uniksowy rzekomo liczy, ogłoszono 24 sekundy przestępne, które w „unix time” nie są w ogóle brane pod uwagę.
Minęło więc o całe 24 sekundy więcej czasu, niż liczba Unix Time wskazuje.

BIOS liczy czas w jeden sposób, a zarówno Windows jak i Linux korzystają z clocka wbudowanego w komputer.
hm, ale mówimy o funkcjach które przeliczają czas z jednego formatu na drugi: prawdopodobną przyczyną są błędy zaokrągleń liczb zmiennoprzecinkowych, choć trzeba by było zajrzeć w źródła tych funkcji.

0

Objawię ci straszną prawdę: od 00:00 1 stycznia 1970 roku, a od tej chwili czas uniksowy rzekomo liczy, ogłoszono 24 sekundy przestępne, które w „unix time” nie są w ogóle brane pod uwagę.
Minęło więc o całe 24 sekundy więcej czasu, niż liczba Unix Time wskazuje.

Czyli świat skończy się o 21 grudnia 2012 20:59:36 czasu Unixowego? Czy 'koniec świata.exe' też używa systemu Linuxowego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1