Количество компьютерных форматов представления времени поражает всяческое воображение. Видимо ввиду древности возникновения задачи хранить момент времени, область полна архаики. Вкратце перечислю некоторые из решений (рассматриваем наиболее популярную 32-битную архитектуру):
Unix time (POSIX-время,
time_t) в 4 байтах хранит время в секундах, прошедшее с 1 января 1970 года, следовательно, может представлять время до 19 января 2038 года.
Unix time 64 — то же, что и предыдущее, только 64-битное. 8 байт, от 1 января 1970 года примерно 292 миллиарда лет.
Юлианские дни (JD) используется для указания дня в астрономии (для указания конкретного момента в дне используют дробную часть). Если ограничить его представление 4 байтами, он представит даты от полудня 1 января 4713 до н. э. примерно 12 миллионов лет. Именно эта дата была выбрана ввиду начала сразу нескольких неинтересных циклов и потому, что до нас не дошли упоминания о более ранних астрономических наблюдениях.
Модифицированные юлианские дни (MJD) используются для сокращения записи юлианских дней вычитанием 2400000.5, точкой отсчета становится ночь 17 ноября 1858 года.
BIOS-time измеряет время в тиках с частотой примерно 18.2 Гц с полуночи, занимает 4 байта.
struct tm используется для представления человеко-читаемой даты в стандартной библиотеке C.
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
Таким образом, эта структура размером 36 байт может представить дату от 1 января 1900 (и еще 4 миллиарда лет) с точностью до 1 секунды.
Радуют разнообразием форматы времени, используемые в Windows.
GetTickCount возвращает 4-байтовое число, равное количеству миллисекунд, прошедших с момента включения компьютера, представляя интервал до 49.7 суток.
GetTickCount64 это ее 64-битный аналог, который позволяет представлять интервалы до 580 миллионов лет.
FILETIME это такой виндовый unix-time, только с БШ. БШ обеспечивается за счет 64-битности, позволяя указывать дату в 100-наносекундных интервалах, начиная с 1 января 1601 года на протяжении 58 тысяч лет.
SYSTEMTIME — БШ-tm от Microsoft.
struct SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
};
Экономит на размере полей, поэтому занимает 16 байт, и представляет с секундной точностью время от 1601 года почему-то до 30827.
Кроме вышеперечисленных бинарных форматов существуют текстовые, тысячи, тысячи их. Но еще один виндовый я все же упомяну:
CIM_DATETIME — в формате yyyymmddHHMMSS.mmmmmmsUUU в 25 байтах представляющий с точностью 1 миллисекунда время от 0-го до 9999-го года.
Такое разнообразие страшно раздражает, и я задался вопросом, а нельзя ли как-нибудь решить эту проблему раз и навсегда?
Отметим, что дискретизация самого точного представления (FILETIME), равная 100 наносекунд, совершенно недостаточна для представления длительности, скажем, фемтосекундных лазерных импульсов, которыми давно и успешно
исследуют механизмы химических реакций, а диапазона самого «древнего» (JD) и самого «широкого» (tm) недостаточно для датировки древних горных пород или превращения Солнца в красного гиганта.
Согласно принципу квантовой неопределенности и теории относительности, измерить время точнее
планковского времени, равного примерно 5.39x10
−44 секунд, принципиально невозможно. Кроме того, время существования нашей Вселенной не превышает 13.85 миллиардов лет. Радостно делим одно на другое, берем двоичный логарифм и получаем, что хватит 203 бит. Округляем до 256 бит (32 байта, tm — и тот больше) и обнаруживаем, что любое обозримое событие и любой наблюдаемый интервал вполне может быть представлен таким числом.
Даешь 32-байтные таймстампы!!!