4

我正在为我的博客使用 timeago jQuery 插件,但似乎时间本身存在问题,我无法确定问题的原因是什么。

它目前是当地时间 2011 年 5 月 31 日 02:30 (格林威治标准时间+夏令时)。现在我使用的示例日期是...... 2011 年 5 月 31 日 02:01。以下标签将是

<abbr class="timeago" title="2011-05-31T02:01:44+00:00">May 31st, 2011</abbr>

然而,jQuery 输出日期是“从现在起 32 分钟”,由于某种原因,它提前一小时。

有人知道我在这里做错了什么吗?

4

2 回答 2

10

在这里猜测一下,所以我可能完全错了。

问题是您指定的测试时间atmp 有一个偏移量,0因此它与 UTC 相同 - 但这与您在 GMT timezone 中遵循 DST 时的时间不同

GMT 与 UTC 相同,即偏移量为0. 但是,您提到 DST 并且在遵循夏令时时,您的时钟向前移动 1 小时,您的 UTC 偏移量也是如此。因此,就 UTC 而言,您现在的时间实际上是UTC + 0100. 这就是额外时间的来源。

毕竟,首先将所有时间转换为 UTC 可能会有所帮助,对吧?02:30 GMT而遵循 DST 是01:30 UTC. 因此,与此相比, 的测试时间戳02:01 UTC大约是未来半小时 - 因此32 minutes from now.

如果您希望看到30 minutes ago,那么您的测试日期应该是2011-05-31T01:01:44+00:00为了表达一个 UTC 时间戳,该时间戳相当于02:01 您的时钟显示的时间。


最安全的解决方案是始终使用 UTC 时间戳——这就是 SO、Facebook 和 Twitter 发布帖子的日期。然后可以为每个用户的时区明确解释和格式化 UTC 时间戳。

那么,您的工作将是确保您使用的时间戳不仅仅是您在钟面上看到的,而是它的 UTC 等价物 - 在您当前的时区,UTC 时间可能比显示的时间晚 1 小时。并且根据您用于生成 HTML 的内容,您应该能够找到一个内置于语言/平台或作为第三方库的函数,它将为您提供与显示的当前时间相同的 UTC考虑 DST 时区的时钟。

于 2011-05-31T02:18:55.240 回答
0

它目前是当地时间 2011 年 5 月 31 日 02:30 (格林威治标准时间+夏令时)。

你不说 DST 是什么,我假设它是 +1h,与上面的 no.good.at.coding 相同

现在我使用的示例日期是...... 2011 年 5 月 31 日 02:01。以下标签将是

2011-05-31T02:01:44+00:00

您在02:30,即01:30 UTC。您的日期从UTC 时间 02:01开始,即您的时间03:01,即未来半小时。

正如建议的那样,无论如何您都应该将所有日期保存为 UTC。例如 Python 有一个 datetime.utcnow() 方法。始终保存为 UTC,然后在显示时转换为本地时区。

于 2011-06-01T13:45:47.877 回答