【问题标题】:Convert JS Date + Time to Different Time Zones将 JS 日期 + 时间转换为不同的时区
【发布时间】:2015-11-27 21:17:06
【问题描述】:

假设您网站的用户选择天数和帐户时区:

2015-09-02 14:15:00 
2015-09-02 15:30:00
2015-09-03 17:10:00

时区:“America/Los_Angeles"

您将这些信息发送并保存在服务器上,服务器应该在用户需要的完全相同的本地时间执行 A 函数。稍后用户可以将他的时区更改为"Europe/Stockholm",我们会根据该时区重新调整日期。

从客户端到服务器的流程应该是什么样子?我的行动是什么?互联网上有很多错误和错误的信息,我真的需要一些可靠的建议。

这是我想出的:

我将这个 javascript 对象保存到数据库中 moment.tz("2015-09-02 14:15:00", "America/Los_Angeles").toDate()

根据这个日期我执行函数,如果我们需要重新计算时区,我们只需要几天/时间并使用相同的东西。

我了解到这种方式可能无法适应夏令时,这是错误的。帮忙?

【问题讨论】:

  • 在momentjs中,您有一个功能可以知道是否是DST momentjs.com/docs/#/query/is-daylight-saving-time可以帮助您?
  • @romuleald 是的,我可以看到,但如果是/否,我真的不知道我能做什么......我不太了解日期的复杂性
  • 如果返回 true 则加一小时
  • @romuleald - 这不是必需的,实际上会使事情变得更糟。您永远不需要手动操纵时间。
  • @MattJohnson 浏览器会自动执行,对吗?

标签: javascript date timezone momentjs


【解决方案1】:

我将通过将您的问题分解为相关部分来回答这个问题。

...服务器应该在用户需要的完全相同的本地时间执行一个函数。

好的,所以我假设您正在安排将来运行的事件。这很重要,因为如果您要为已经发生的事件记录时间戳,则方法会完全不同。

...稍后用户可以将他的时区更改为“欧洲/斯德哥尔摩”,我们会根据该时区重新调整日期。

您不应调整活动的日期。将时区与事件关联,而不是与用户关联。您也可以拥有每个用户的时区,并且可以针对显示的时区进行调整 - 但您应该单独保留原始事件时间和时区,除非用户直接对其进行编辑。 (注意,我在这里对您的项目内部进行了一些假设,但这是最好的一般建议)。

我将此javascript对象保存到数据库moment.tz("2015-09-02 14:15:00", "America/Los_Angeles").toDate()

JS Date 对象代表一个瞬间,但使用代码运行的本地时区进行投影。因此,只要您致电toDate,您对 moment-timezone 所做的任何时区调整都将被撤消。您应该避免致电toDate。改用moment的函数,比如format,可以保留时区偏移。

我已经读到这种方式可能无法适应夏令时,这是错误的。

不知道你在哪里读到的,但那是不正确的。 Date 对象和 moment 对象(无论是否使用时刻时区)都可以正确解释 DST。

您可能还希望查看我写的有关安排未来活动的其他一些答案。从this one 开始,然后点击其他帖子的链接。

【讨论】:

  • 非常感谢您的回答,所以很高兴了解 toDate() 如何将其作为日期对象保存到数据库中?我需要为我正在使用的队列处理器作业设置一个日期,因此它需要下一个事件发生而不是所有未来事件。那么你知道如何使用时刻时区来转换我可以保存到数据库的真正的 js 日期对象吗?或者我这样做的唯一方法是让队列工作人员使用时刻时区日期?但这似乎仍然很复杂。我不知道队列工作人员如何截取日期。以及何时真正运行这项工作。
  • 抱歉,我必须更多地了解您的架构才能回答这个问题。但一般来说,Date 对象不会存储到数据库中 - 只有它们的 是。特定的数据访问 API 可能需要某种形式的对象,但它仍然需要读取并序列化该对象,然后才能将其写入数据库期望的形式。
  • 还要考虑您的数据访问机制可能正在查看 Date 对象的本地值,但它很可能会查看 UTC 等效值,例如 @ 的时间戳结果987654331@或.valueOf(),或.toISOString().toUTCString()的字符串结果。如果它存储 UTC 时间,那么您就可以开始了 - 因为它反映了您打算运行作业的同一时刻。
  • 非常感谢它现在肯定沉没了。我想我现在可以弄清楚如何处理它了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 2016-08-29
相关资源
最近更新 更多