【问题标题】:Javascript convert between timezones with momentjsJavascript 使用 momentjs 在时区之间转换
【发布时间】:2014-10-17 16:01:39
【问题描述】:

在我的应用程序中,用户选择日期 + 时间和时区。此选择必须以他们自己的时区显示给其他用户,这意味着如果来自纽约的用户 A 选择美国东部时间 8 月 8 日凌晨 3:00,来自北京的用户 B 将看到此日期时间转换为中国标准时间 (CST)。

我认为要做到这一点 - 好的,我保存用户 A 的日期并告诉他从 4 个时区中进行选择。服务器端我使用时刻时区将其从他的 EDT 选择转换为 UTC,并将其保存为数据库中的 UTC,这样当我阅读它时,我会根据他们自己的时区将其转换回其他用户。

这是一个正确的方法还是我把事情复杂化了?目的是用户A可以选择她想要的时区,数据库保存为标准化的UTC,目标用户在他自己的时区看到。

(我在服务器端使用 node.js) 谢谢,

【问题讨论】:

  • 什么是“标准化 UTC”?您必须存储时区,不是吗?喜欢"CST"-6
  • 你的做法绝对正确。
  • @Rudie - 是的,正确;我想我将日期存储为 UTC,并在时区“CST”中存储一个单独的字段。
  • @ScottCramer 谢谢!

标签: javascript node.js datetime timezone momentjs


【解决方案1】:

您的方法是正确的:将 UTC 时间保存在数据库中,并根据用户的时区显示给用户。

momentjs可以帮你做,但是你需要给它历史时区变化的文件。

请查看http://momentjs.com/timezone/ 以获得更多解释。

有了这个,就这么简单

var jun = moment("2014-06-01T12:00:00Z");
jun.tz('America/Los_Angeles').format('ha z');  // 5am PDT

另外:不要将用户时区存储为 EDT、CST 或 -6。小时班次可以随夏令时、冬令时而变化,.. 你需要存储 Olson 格式,'America/Los_Angeles'

【讨论】:

  • 实际上,在用户的时区显示 UTC 日期/时间并不需要太多帮助。只要您对使用用户机器的时区集显示它感到满意,这就是默认情况下的工作方式。例如,“new Date('2014-08-24 14:52:31Z')' 在印度的机器上使用 toString 打印时会产生“Sun Aug 24 20:22:31 GMT+0530 (India Standard Time )"。
  • @Jerome WAGNER - 谢谢你的回复;关于您的最后评论,我想我会这样做:存储“KST”,并在客户端:if(KST)then moment.tz(utcDate, 'Asia/Seoul') - 这样可以吗?
  • @Amc_rtty 不,我不会存储“KST”,因为通常可以在特定时间点理解 KST(有时您有 KDT)。通过使用地理映射(亚洲/首尔),您可以存储与特定时间点无关的内容(除非它指的是存储时间时用户所在的地方)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多