Почему Delphi использует двойной (8 байтов) для хранения даты и времени вместо Int64 (8 байт)? Поскольку плавающая точка с двойной точностью не является точным значением, мне любопытно, что точность даты и времени unix, хранящихся в значении Int64, будет лучше, чем точность даты и времени Delphi?
Почему Delphi использует double для хранения даты и времени вместо Int64?
Ответ 1
Простым объяснением является то, что тип Delphi TDateTime
отображается непосредственно в формате даты и времени OLE/COM.
Embarcadero решил использовать существующее представление даты/времени, а не создавать еще один, и выбрал то, что было в то время, наиболее очевидным исходным вариантом платформы.
Несколько полезных статей о представлениях даты и времени Windows:
- Как распознать различные типы временных меток с довольно далекого пути, Раймонд Чен
- Eric Полное руководство к VT_DATE, Эрик Липперт
Что касается точности, вы хотели бы сравнить время Unix с TDateTime
. Время Unix имеет вторую точность для 32 или 64-битных значений. Для значений, близких к эпохе, двойной имеет гораздо большую точность. Есть 86 400 секунд в день, и на много порядков больше двойных значений между 0 и 1, например. Вам нужно пройти примерно 188 143 733 год до того, как точность времени Unix превысит точность TDateTime
.
Несмотря на то, что вы сосредоточились на размере типов, представление, безусловно, имеет решающее значение. Например, если вместо представления даты как секунд после эпохи, она была представлена как миллисекунды после эпохи, тогда точность времени Unix будет в 1000 раз больше. Разумеется, диапазон также уменьшился бы в 1000 раз.
Вы должны быть осторожны в отношении точности этих типов в изоляции. Эти типы не существуют изолированно, и источник значений важен. Если время исходит из файловой системы, скажем, то это фактически определит точность значения.