sharpc (sharpc) wrote,
sharpc
sharpc

Categories:
  • Music:

Форматы времени

Количество компьютерных форматов представления времени поражает всяческое воображение. Видимо ввиду древности возникновения задачи хранить момент времени, область полна архаики. Вкратце перечислю некоторые из решений (рассматриваем наиболее популярную 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-байтные таймстампы!!!
Tags: наука, программирование
Subscribe

  • Инфраструктура Python

    В ноябре 2017 я начал собирать в виде IPython Notebook сниппеты работы с разными полезными для исследовательского программирования библиотеками…

  • Теормин по STL для СП, часть 2/2

    Это продолжение части 1. <algorithm>В STL реализованы некоторые простые и часто используемые обобщенные алгоритмы. Обобщенные они потому,…

  • Теормин по STL для СП, часть 1/2

    Это теоретический минимум по STL для занимающихся спортивным программированием, подмножество возможностей стандартной библиотеки C++, полезных для…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 26 comments

  • Инфраструктура Python

    В ноябре 2017 я начал собирать в виде IPython Notebook сниппеты работы с разными полезными для исследовательского программирования библиотеками…

  • Теормин по STL для СП, часть 2/2

    Это продолжение части 1. <algorithm>В STL реализованы некоторые простые и часто используемые обобщенные алгоритмы. Обобщенные они потому,…

  • Теормин по STL для СП, часть 1/2

    Это теоретический минимум по STL для занимающихся спортивным программированием, подмножество возможностей стандартной библиотеки C++, полезных для…