问题描述和重现步骤:
假设我从后端收到了这种格式的日期:
"2018-10-10T13:00:00+11:00"
解析和格式化后我希望在前端看到的内容:
10-10-2018 1.00 PM
我得到了什么:
10-10-2018 5.00 AM
我不在乎我的系统时区是什么。 我也不想看到 UTC 时间。 我怎样才能实现它?
请包括使用的所有变量的值。
往上看。
环境:
没关系,它不应该取决于环境。 顺便说一句,这就是问题所在,因为这取决于!
Afaik,在格式化日期时,moment 默认使用设备的时区(这也是 Javascript 的标准行为)。 所以是的,格式化日期应该取决于环境。 例如,在我的设备上,我得到了你的日期,这是我当地时间(奥克兰)的正确时间:
moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'
如果要手动为用户设置默认时区,可以使用moment-timezone
和IANA 时区名称:
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"
最有用的评论
你可以试试
parseZone
:例如,对于 BST (UTC + 1) 中的区域设置时区