在sqlite数据库中存储日历日

时间:2020-03-06 14:36:11  来源:igfitidea点击:

我需要将带有日历日期(只是一天,没有时间)的项目存储在sqlite数据库中。在列中表示日期的最佳方法是什么?朱利安天数和unix秒数是可以想到的合理选择。如果我在几天的其他时间不使用单位,应该是几点钟?

更新:我知道ISO8601,实际上使用它来将日期存储为原型的YYYY-MM-DD格式的字符串形式的日期。但是对于各种算术,我必须在内部将其转换为某个数字,因此我更喜欢存储一个数字,然后仅转换为字符串进行显示。该数字应使用什么单位,以什么起源,如果该单位比天数更精确,则应在一天中的什么时间使用?

解决方案

如果希望将日期传递给外部工具或者库,则应使用期望的任何格式。 Unix时间似乎是数字钟表的通用语言,因此,如果外部环境无法为我们做出选择,那么这是一个很好的默认设置。

ISO 8601可能是令人感兴趣的。

编辑:

But for various arithmetic I have to convert it to some number internally, so I'd prefer to store a number and just convert to string for display.

嗯,那很有道理。如果环境(.NET?Python?C ++?)具有时间处理工具,则最好使用其本机单元和纪元。没有理由重写所有这些日期处理函数。他们比他们看起来要棘手。否则,我会在当地(格里高里历)日历中使用天数,因为这是我们申请的合理时期。慷慨大方,当我们突然需要比预期的日期更早处理日期时,我们就不需要反向Y2K错误。

一天中的时间完全取决于品味。午夜似乎是最干净的选择(小时,分钟,秒字段中的所有零),但是由于它永远不会到达用户手中,因此没有实际意义。实际上,这将是个复活节彩蛋的好去处。

如果要覆盖基础,请确保将日期存储在utc中并选择iso标准。这种方法需要最少的精力,并且可以保护代码免受将来Interop的困扰。
我同意@skymt ISO 8601是一个不错的选择。

如果我们使用的是C ++,那么boost :: date_time非常值得一看。

"最佳"几乎完全取决于日期的来源(NSDate对象,一些XML提要)以及如何操作它们(简单地按原样存储,而不是像"天数直到"这样的算术)。

我不一定推荐这样做,但是我写了一个应用程序,该应用程序还需要在SQLite数据库中存储日期而非时间。最初,我使用了两列,即Month和Day,其中Month定义为自2000年1月以来的月数。我需要强制执行每行一次的日期,因此我在这两列中定义了UNIQUE索引,使得更新速度非常慢。

对于第二次尝试,我使用了类似的方案,但将日期的低5位用于月份,将其余的高位用于月份(同样,自2000年1月以来),将日期编码为一个数字。转换函数为:

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

该方案保留了日期的数字顺序,并易于将它们拆分为多个部分。这对我的应用程序来说很有意义,因为我每月都要存储数据。如果给定一个日期,而我们想查找下一个日期,则此方案可能不是最佳方案,因为日期+ 1可能不是有效日期。