【问题标题】:Timezone in ruby红宝石中的时区
【发布时间】:2014-02-10 22:06:27
【问题描述】:

我有一个简单的预订场景,其中用户可以与其他用户预订预定义的时段。我这样做的方式是我使用 postgres 将时隙存储为字符串数组。一个典型的数组表示类似 ["10:00PM", "10:30PM"]。但是,由于不同的用户位于不同的时区,所以我使用客户端来检测时区并在各自的时区显示插槽。我的问题是这足以存储时隙并将它们转换为不同的时区还是我需要存储确切的时间戳?

我正在为 db 使用 ruby​​ 和 rails framewokr 和 postgres

【问题讨论】:

  • 由于您在array 中将时间数据用作strings,因此您无法在数据库中使用datetime 数据类型的优势。在这种情况下,我不清楚你的问题到底是什么?
  • 我只对不同时区的实际时间转换感兴趣,但我想知道的是拥有日期信息是否重要,它是否会影响转换的准确性?

标签: ruby-on-rails ruby postgresql timezone


【解决方案1】:

我正在使用 postgres 将时隙存储为字符串数组

不要。请不要。

如果它们是具体的时间戳(日期+时间),请将它们存储为 timestamptz,这样它们就与时区无关。您可以使用AT TIME ZONE 运算符在用户本地时间获取它们或将它们转换为客户端。

如果它们只是时间,请使用 time 数据类型,并将它们存储为 UTC 时间,使用 AT TIME ZONE 运算符酌情与本地时间进行转换,或进行客户端转换。

如果可能,将它们存储在规范化表中。如果由于某种原因(说服我)你不能这样做(说服我),至少使用适当数据类型的 PostgreSQL 数组,而不是字符串数组 - 或者更糟,就像你可能正在做的那样,Ruby 的字符串表示字符串数组。

这是最近在 dba.stackexchange.com 上讨论的问题的变体,讨论了 whether native database types or a comma separated list would be better。简短的版本:以一种对数据库友好的方式来做,除非你有一个非常非常好的理由不这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多