代码之家  ›  专栏  ›  技术社区  ›  jblocksom

在sqlite数据库中存储日历日

  •  1
  • jblocksom  · 技术社区  · 18 年前

    我需要在sqlite数据库中存储具有日历日期(仅限当天,无时间)的项目。在列中表示日期的最佳方法是什么?朱利安日和Unix秒成为了人们心目中的合理选择。如果我去的单位不是白天,应该是几点?

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

    4 回复  |  直到 18 年前
        1
  •  4
  •   skymt    18 年前

    如果您希望将日期传递给外部工具或库,那么应该使用它期望的任何格式。Unix时间似乎是数字钟表业的通用语言,所以如果外部环境不能为您做出选择,它是一个很好的默认值。

    ISO 8601 可能感兴趣。

    编辑:

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

    啊,这是有道理的。如果您的环境(.net?蟒蛇?C++?)有时间处理工具,最好使用他们的原生单位和时代。没有理由重写所有这些日期操作函数;它们比看起来更狡猾。否则,我会在当地过几天(公历?)日历从一个合理的时代开始为您的应用。慷慨一点,当你突然需要提前处理一个日期时,你不会想要一个反向的千年虫。

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

        2
  •  0
  •   Aaron Fischer    18 年前

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

        3
  •  0
  •   ravenspoint    18 年前

    如果你使用C++,那么Booo::DATEYTIME非常值得一看。

        4
  •  0
  •   benzado    18 年前

    “最佳”几乎完全取决于日期的来源(nsdate对象,一些XML提要)和操作方式(简单地按原样存储,而不是执行一些类似“days-until”的运算)。

    我不一定推荐这样做,但我写了一个应用程序,它还需要将日期而不是时间存储在sqlite数据库中。起初,我用了两列,月和日,其中月被定义为自2000年1月以来的月数。我需要对每个日期强制执行一行,所以我在这两列中定义了一个唯一的索引,结果更新速度非常慢。

    在第二次尝试中,我使用了一个类似的方案,但将日期编码为一个数字,方法是使用日期的后5位和月份的剩余高位(同样,从2000年1月开始)。转换函数为:

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

    此方案保留了日期的数字顺序,并便于将其拆分为组件。这对我的应用程序来说是有意义的,因为我每月都会存储大量的数据。如果给定日期,您希望查找下一个日期,则此方案可能不是最佳方案,因为日期+1可能不是有效日期。