【问题标题】:Moment js time zone date conversion issueMoment js时区日期转换问题
【发布时间】:2021-12-14 06:58:27
【问题描述】:

我正在使用 moment js 根据他的喜好将用户系统时间转换为用户指定的时区。用户系统时区是 IST,他正在指定不同的时区。为了设置我正在使用的相同

moment.tz.setDefault("Pacific/Pago_Pago");

但在其中一种情况下,我得到了不同的日期。如果我这样做了

moment().startOf('day')

我今天的日期是 Thu Oct 28 2021 00:00:00 GMT+0530(印度标准时间),但如果我这样做了

moment(endDate).startOf('day')

我得到 2021 年 10 月 27 日星期四 00:00:00 GMT+0530(印度标准时间) 其中结束日期是最后一条语句的结果,即 2021 年 10 月 28 日星期四 00:00 :00 GMT+0530(印度标准时间)

我在这里做错了什么。

【问题讨论】:

标签: javascript datetime timezone momentjs moment-timezone


【解决方案1】:

创建时刻对象时使用的时区保留为对象的一部分,并用于后续处理。如果在创建初始时刻对象后更改了默认时区,则会出现上述效果。

例如

// Set default to IST (+5:30)
moment.tz.setDefault('Asia/Kolkata');

// Create initial moment using default timezone
let start = moment().startOf('day');

// Changing the default here doesn't affect above moment
moment.tz.setDefault('Pacific/Pago_Pago');

// This still uses the initial +5:30 offset, not -11:00 for Pago Pago
let timestamp = start.toString();

// This uses the timestamp for the original timezone, but
// then gets start of day in new default timezone
let end = moment(timestamp).startOf('day');

console.log( `Start: ${start.toString()}\nEnd  : ${end.toString()}` );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data-10-year-range.js"></script>

【讨论】:

  • 我在这里面临的问题,我正在使用转换后的时区日期到日期控制。以后用户可以使用日期控件更改日期,但是当我从日期控件中读取日期时,它会丢失时区设置并再次给系统时区,我正在寻找一种保留时区设置的方法,在这种情况下是 Pago Pago跨度>
  • 我遇到了这篇帖子stackoverflow.com/questions/37903594/…中提到的同样的问题。有没有更好的方法来解决这个问题。
  • @rahul——如果你只想使用日期,即没有时间组件,那么不要使用 Date 对象。日期没有(或不应该)有时区。 ECMAScript 将仅日期字符串(即 yyyy-mm-dd 格式的日期)解析为 UTC 是一个严重错误,因为它与 ISO 8601 或常识不一致。如何解决问题取决于用例。如果你有一个特定时区的时刻对象,然后转换为字符串以用作表单控件的值,然后取回另一个字符串,那么你必须记住初始时区并重新应用它。
  • @rahul — 链接中的问题最好通过对所有内容使用 UTC 并且仅使用时区进行演示来解决。如果使用多个时区,则向用户显示日期和时间的日期、时间和时区,以便他们知道发生了什么。
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 2020-05-27
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多