Moment: 是否可以保留后端时区?

创建于 2018-10-04  ·  3评论  ·  资料来源: moment/moment

问题描述和重现步骤:
假设我从后端收到了这种格式的日期:

"2018-10-10T13:00:00+11:00"

解析和格式化后我希望在前端看到的内容:

10-10-2018 1.00 PM

我得到了什么:

10-10-2018 5.00 AM

我不在乎我的系统时区是什么。 我也不想看到 UTC 时间。 我怎样才能实现它?

请包括使用的所有变量的值。

往上看。

环境:

没关系,它不应该取决于环境。 顺便说一句,这就是问题所在,因为这取决于!

最有用的评论

你可以试试parseZone

例如,对于 BST (UTC + 1) 中的区域设置时区

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"

所有3条评论

Afaik,在格式化日期时,moment 默认使用设备的时区(这也是 Javascript 的标准行为)。 所以是的,格式化日期应该取决于环境。 例如,在我的设备上,我得到了你的日期,这是我当地时间(奥克兰)的正确时间:

moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'

如果要手动为用户设置默认时区,可以使用moment-timezoneIANA 时区名称:

moment.tz.setDefault('America/New_York');

这将强制为该时区完成所有格式化并且独立于环境。

这是文档的链接: https: //momentjs.com/timezone/docs/#/using -timezones/default-timezone/


无法从偏移量中找出用户的时区(因为多个时区可以共享相同的偏移量,例如取决于夏令时),但您可以将Etc区域名称用于“通用”区域,例如Etc/GMT-11在您的情况下(这些区域的符号是倒置的)。 在您的情况下,将用户的时区存储为设置并将其保存在服务器上,或者将其与时间戳一起保存可能更有意义。

然后您可以使用例如打印某个时区中的单个日期

moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");

谢谢, @simonhaenisch

我见过 tz 插件,但我认为它有助于管理时区,比如从一个转换到另一个。 对我来说使用它只是为了不触及时区听起来很奇怪:)

如果要手动为用户设置默认时区

不幸的是,服务器中没有default时区。 每个用户都有自己的时区,保存在配置文件中。 前端对此一无所知。

无法从偏移量中找出用户的时区

没关系,我不在乎时区。 我所需要的只是保持即将到来的日期不变。

将用户的时区存储为设置并将其保存在服务器上,或将其与时间戳一起保存。

这正是正在发生的事情。 时区是一个设置,日期与它一起保存为时间戳。

由于后端 API 在我的控制之下,我只能发送缩减版的日期,而没有时区偏移。 我希望它有所帮助。

但是,为什么 moment.js 没有这样的东西真的很有趣:

moment(somDateTime).format({ formatWithDeviceTimezone: true })

或一种:)

其中formatWithDeviceTimezone默认为 false。

无论如何,谢谢,现在我看到了这个问题。

你可以试试parseZone

例如,对于 BST (UTC + 1) 中的区域设置时区

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
此页面是否有帮助?
0 / 5 - 0 等级