1

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

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

4

4 回答 4

4

如果您希望将日期交给外部工具或库,您应该使用它期望的任何格式。Unix 时间似乎是数字时计的通用语,因此如果外部环境不适合您,它是一个很好的默认设置。

ISO 8601可能很有趣。

编辑:

但是对于各种算术,我必须在内部将其转换为某个数字,所以我更愿意存储一个数字并转换为字符串进行显示。

啊,有道理。如果您的环境(.NET?Python?C++?)有时间处理工具,最好使用它们的本机单元和纪元。没有理由重写所有这些日期操作函数。他们比看起来更棘手。否则,我会使用本地(公历?)日历中的天数,因为您的应用程序处于合理的时期。大方一点,当您突然需要处理比您预期更早的日期时,您不希望出现反向 Y2K 错误。

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

于 2008-09-23T14:44:47.017 回答
0

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

于 2008-09-23T14:59:02.787 回答
0

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

于 2008-09-23T15:27:22.143 回答
0

“最佳”几乎完全取决于日期的来源(NSDate 对象、一些 XML 提要)以及它们的操作方式(简单地按原样存储与做一些算术,如“直到”)。

I'm not necessarily recommending this, but I wrote an app which also needed to store date-but-not-time in an SQLite DB. At first I used two columns, Month and Day, where Month was defined as the number of months since January 2000. I needed to enforce one-row-per-date, so I defined a UNIQUE index across those two columns, and it turned out to make updates horribly slow.

For my second attempt, I used a similar scheme but encoded the date into one number, by using the bottom 5 bits for the Day and the remaining upper bits for the Month (again, since Jan 2000). The conversion functions were:

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

该方案保留了日期的数字顺序,并且可以轻松地将它们拆分为组件。这对我的应用程序很有意义,因为我按月存储数据。如果给定一个日期,您想查找下一个日期,则此方案可能不是最好的,因为日期 + 1 可能不是有效日期。

于 2008-09-23T23:13:51.037 回答