mysql - 使用 unix 纪元存储日期和日期时间

标签 mysql datetime date sqlite unix-timestamp

我需要一种通用的方法来在多个数据库(现在是 Sqlite、MySql 和 PostgreSql)中存储日期和日期时间。 我需要日期时间具有微秒精度。

  • Sqlite 没有内置日期和时间。
  • MySql 日期时间没有微秒精度。

所以我想将日期保留为整数(4 字节)- 自 unix 纪元以来的天数,并将日期时间保留为整数(8 字节)- 自 unix 纪元以来的微秒。

问题:

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

最佳答案

  1. time()/86400 没问题。我以前做过;你不应该预料到任何问题。您还可以存储 time() 截断到最接近的 86400 的倍数,这可能会更好一些,因为您可以将它传递给已经接受 time_t 的各种函数,并让它在午夜 UTC 时出现在相关日期。

  2. 不用担心闰秒。只有专门的软件才会将它们考虑在内。所有通用操作系统上的系统日期和时间,以及所有通用日期和时间库都假装它们不存在。您的 NTP 服务器通过在它们发生时将系统时钟提前一秒来实现它们。

  3. 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/

相关文章:

php - 分页仅显示产品的第一页;在第 1 页之后,出现 "Warning: mysqli_query(): Empty query"错误

C# : Why is my SqlDateTime. MinValue 在不同的机器上不同?

java - JSONParser 在 Android 应用程序中显示错误

mysql - Magento2 数据库导入错误

PHP DateTime 微秒总是返回 0

c# - DateTime.Parse 关闭一小时。为什么?

sql-server - SQL Server 函数将工作日添加到日期

php - MySQL:保持服务器时区或用户时区?

java - 如何获得给定时间下一小时内的随机时间?

MySQL 外键约束 - 错误 1452 - 无法添加或更新子行