在任何地方显示本地插入的时间戳

时间:2017-05-31 05:57:39

标签: date timezone

在悉尼时间6:00am,Rory Allan点击浏览器中的foofoo按钮。

这将在foofoo表中插入我的服务器数据库中的8:00pm UTC时间戳。

很多人对这个foofoo按钮很兴奋,他们希望看到当天悉尼时间的时间Rory点击了它。

当我盯着加利福尼亚州的屏幕并查看点击状态时,我想看到他点击了6:00am,而不是1:00pm,如果我拉,我就会看到来自服务器的UTC时间,让我的浏览器转换它。

你看,许多不同的人点击foofoo,例如德国的Phillip Herman,或俄罗斯的Ivan Efimiov。我们关心的是他们点击它的那一天的相对时间,无论观看位置如何,都是在他们点击它的位置。

  

我不知道最好的方法。我是否采用本地时间戳并将其转换为字符串,除了实际的UTC时间戳之外还存储它?或者这是一个常见的问题,我还没有找到共同的解决方案?我猜/希望后者。

这不是特定于语言的。这些日期有很长的路程:

Unix timestamp > Python date > JSON > Node > Mongo > Node > Browser

1 个答案:

答案 0 :(得分:1)

好的,显然8:00pm UTC信息不足。但是你真的想知道什么?

  • 06:00是否有足够的信息?

    • 查找仅限时间的数据类型,最好是那些反映时间而非经过时间的数据类型。这些通常称为LocalTimeTimeOfDay等。
    • 或者,使用HH:MM格式的字符串(24小时制)
    • 或以整数(60 * HH) + MM记录总分钟数。
    • 或者如果你需要更高的精度,那么使用秒,或毫秒,或微秒等......
  • 06:00 Australia/Sydney是否有足够的信息?

    • 如前所述存储时间,并将时区名称存储在单独的字符串中。
    • 但要小心,因为没有约会你不知道UTC + 10或UTC + 11是否有效。
  • 06:00+10:00是否有足够的信息?

    • 可能寻找time with time zone数据类型,例如PostgreSQL中存在的数据类型,尽管PostgreSQL文档强烈反对使用此类型。
    • 相反,请将时间和偏移量存储为单独的组件。
    • 请注意,因为您不一定知道这些数据是否来自悉尼。此外,还有其他时区的UTC + 10。

假设您有日期,例如今天,那么:

  • 2017-05-31T06:00是否有足够的信息?

    • 将日期和时间存储在一个有时被称为DateTimeLocalDateTime的各种语言的组件中 - 但请注意它不受任何特定时区的约束。在.NET中使用DateTimeKind.Unspecified,或在Python等中使用“天真的”DateTime。
    • 对于MongoDB和其他没有此类型的人,请使用ISO8601格式的字符串。
    • 要小心,因为这个时间可能来自世界上任何地方。这里没有任何内容与特定时间点相关。
  • 2017-05-31T06:00+10:00是否有足够的信息?

    • 为此目的,某些语言和数据库具有DateTimeOffsetOffsetDateTime类型。
    • 如果没有,您可以存储“Unix时间戳”,分别存储来自UTC的偏移量。
    • 或者你可以存储一个ISO8601格式的字符串,其中包含偏移量 - 在比较/排序时要非常小心。
  • 2017-05-31T06:00 Australia/Sydney是否有足够的信息?

    • 分别存储时区中的日期+时间组件。
    • 考虑在DST回退过渡期间时间可能不明确。
  • 2017-05-31T06:00+10:00 Australia/Sydney是否有足够的信息?

    • 这里有我们可能需要的一切。在Java / Joda-Time / Noda-Time中使用ZonedDateTime,或在Python中使用“感知”DateTime(pytz,dateutils等),或在平台中存在类似类型。
    • 注意timestamp with time zone,因为您可能希望它存储时区,但通常不会(尽管名称)。
    • 如果不可用,则考虑存储Unix时间戳并将时区名称分隔为字符串。

正如您所知 - 有很多选项,它实际上取决于每种语言/平台中可用的确切用例和功能。如果您单独搜索/询问每个细节,您会找到更多详细信息。