我需要一种通用的方法来在多个数据库(现在是 Sqlite、MySql 和 PostgreSql)中存储日期和日期时间。 我需要日期时间具有微秒精度。
- Sqlite 没有内置日期和时间。
- MySql 日期时间没有微秒精度。
所以我想将日期保留为整数(4 字节)- 自 unix 纪元以来的天数,并将日期时间保留为整数(8 字节)- 自 unix 纪元以来的微秒。
问题:
- 将日期转换为自 unix 纪元以来的天数的正确方法是什么?我发现了这个:
time.time()/86400
(python)。 - 将日期时间作为时间戳是否可靠?闰秒怎么样 - 这会影响准确性吗?如果在某个时间点将 future 日期存储为时间戳但后来出现闰秒怎么办?
- 还有其他问题吗?
最佳答案
time()/86400 没问题。我以前做过;你不应该预料到任何问题。您还可以存储 time() 截断到最接近的 86400 的倍数,这可能会更好一些,因为您可以将它传递给已经接受
time_t
的各种函数,并让它在午夜 UTC 时出现在相关日期。不用担心闰秒。只有专门的软件才会将它们考虑在内。所有通用操作系统上的系统日期和时间,以及所有通用日期和时间库都假装它们不存在。您的 NTP 服务器通过在它们发生时将系统时钟提前一秒来实现它们。
C 的
gettimeofday
将时间作为两个单独的 4 字节整数值返回:自纪元以来的秒数和自秒开始以来的微秒数 (struct timeval
).类似地,C 的clock_gettime
将时间作为两个单独的 4 字节整数值返回:自纪元以来的秒数和自秒开始以来的纳秒数 (struct timespec
)。如果您关心与现有时间表示的兼容性,您可以选择这两种格式中的一种,而不是从纪元开始计算微秒的 8 字节整数。另一方面,它们都有 y2.038k 错误(除非第一个整数扩展到 8 个字节,总共 12 个字节)并且它们在数据库中使用起来不太方便。所以我认为你关于纪元以来微秒的想法很好。
关于mysql - 使用 unix 纪元存储日期和日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8151609/