使用unix时代存储日期和日期时间

时间:2011-11-16 12:21:26

标签: mysql datetime date sqlite unix-timestamp

我需要一种通用的方法来在几个数据库中存储日期和日期时间(现在是Sqlite,MySql和PostgreSql)。 我需要日期时间精确到微秒。

  • Sqlite没有内置日期和datimes。
  • MySql datetime没有微秒精度。

所以我想把日期保持为整数(4个字节) - 自unix时代以来的天数,以及整数时间(8个字节) - 自unix时代以来的微秒。

问题:

  1. 将日期转换为自unix时代以来的日期的正确方法是什么?我发现了这个:time.time()/86400(python)。
  2. 将日期时间保持为时间戳是否可靠?闰秒怎么样 - 这会影响准确度吗?如果在某个时间点将未来日期存储为时间戳但稍后出现闰秒会怎样?
  3. 还有其他问题吗?

1 个答案:

答案 0 :(得分:2)

  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个字节)并且它们在数据库中使用起来不太方便。所以我认为自从纪元以来你对微秒的想法就好了。