Хранение дат и времени с использованием эпохи Unix - PullRequest
1 голос
/ 16 ноября 2011

Мне нужен универсальный способ хранения даты и даты-времени в нескольких базах данных (сейчас Sqlite, MySql и PostgreSql). Мне нужны даты и времени, чтобы иметь точность в микросекундах.

  • Sqlite не имеет встроенной даты и дат.
  • MySql datetime не имеет точности в микросекундах.

Поэтому я решил сохранить даты в виде целых чисел (4 байта) - дней с начала эпохи Unix, а даты и времени - целых чисел (8 байтов) - микросекунд с начала эпохи Unix.

Вопросы:

  1. Как правильно преобразовать дату в дни со времен unix? Я нашел это: time.time()/86400 (python).
  2. Надежно ли хранить даты в качестве меток времени? Как насчет високосных секунд - это повлияет на точность? Что, если в какой-то момент времени будущая дата будет сохранена как метка времени, но позже появится дополнительная секунда?
  3. Есть еще вопросы?

1 Ответ

2 голосов
/ 28 декабря 2011
  1. время () / 86400 в порядке. Я делал это раньше; Вы не должны предвидеть никаких проблем. Вы также можете хранить усеченное время () до ближайшего кратного 86400, что может быть немного лучше, поскольку вы можете передавать его различным функциям, которые уже принимают time_t и выдают его как полночное UTC на указанную дату. .

  2. Не беспокойтесь о високосных секундах. Только специализированное программное обеспечение учитывает их. Системная дата и время во всех операционных системах общего назначения, а также все библиотеки даты и времени общего назначения делают вид, что их не существует. Ваш NTP-сервер реализует их, просто выдвигая системные часы вперед на одну секунду, когда они случаются.

  3. C gettimeofday возвращает время в виде двух отдельных 4-байтовых целочисленных значений: секунд с начала эпохи и микросекунд с начала секунды (struct timeval). Аналогично, C clock_gettime возвращает время в виде двух отдельных 4-байтовых целочисленных значений: секунд с начала эпохи и наносекунд с начала секунды (struct timespec). Если вы заботитесь о совместимости с существующими представлениями времени, вы можете выбрать один из этих двух форматов вместо 8-байтового целого числа, считающего микросекунды с начала эпохи. С другой стороны, оба имеют ошибку y2.038k (если только первое целое число не расширено до 8 байт, всего 12 байт), и их менее удобно использовать в базе данных. Так что я думаю, что твое представление о микросекундах со времен очень хорошо.

...