【问题标题】:moment.tz(date:string,timezone:string) VS moment.utc(date:string).tz(timezone:string)moment.tz(date:string,timezone:string) VS moment.utc(date:string).tz(timezone:string)
【发布时间】:2021-12-01 04:35:56
【问题描述】:

我很难看出这两行之间的区别。 有吗?

const date1 = moment
  .utc("2021-12-07T10:00:00")
  .tz("Europe/London")
  .format("YYYY-MM-DDTHH:mm:ssZ");

const date2 = moment
  .tz("2021-12-07T10:00:00", "Europe/London")
  .format("YYYY-MM-DDTHH:mm:ssZ");

console.log(date1); // "2021-12-07T10:00:00+00:00"
console.log(date2); // "2021-12-07T10:00:00+00:00"

代码笔:https://codepen.io/tan-aki/pen/QWMwRqw?editors=1112

谢谢!

【问题讨论】:

  • 你预计会有什么不同?
  • 好吧,也许这个问题没有正确表述,他们确实达到了相同的目标,这是给定的。但是实现目标的方式有区别吗?

标签: javascript timezone momentjs moment-timezone


【解决方案1】:

是的,这种语法有所不同。在解释差异之前,我们应该看看时区和给定的时间。

时区:欧洲/伦敦

时间:2021-12-07T10:00:00

对于 12 月的伦敦,DST(夏令时)无效。因此,该区域将是 GMT +0 (UTC)。

为了查看差异,我们应该在 DST 生效时取一个日期值。

考虑 2021-09-07T10:00:00

const date1 = moment
  .utc("2021-09-07T10:00:00")
  .tz("Europe/London")
  .format("YYYY-MM-DDTHH:mm:ssZ");

const date2 = moment
  .tz("2021-09-07T10:00:00", "Europe/London")
  .format("YYYY-MM-DDTHH:mm:ssZ");

console.log(date1); // "2021-12-07T11:00:00+01:00"
console.log(date2); // "2021-12-07T10:00:00+01:00"
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.33/moment-timezone-with-data-10-year-range.min.js"></script>

date1 的小时是 11,而 date2 的小时是 10。

date1解释:

  1. 时刻考虑 UTC 中的“2021-09-07T10:00:00”->“2021-09-07T10:00:00+00:00”
  2. 时间转换为Europe/London时区->“2021-09-07T11:00:00+01:00”
  3. 格式化字符串 -> "2021-09-07T11:00:00+01:00"

date2解释:

  1. 现在考虑欧洲/伦敦的“2021-09-07T10:00:00”->“2021-09-07T10:00:00+01:00”
  2. 格式化字符串 -> "2021-09-07T10:00:00+01:00"

让我们尝试使用包含区域信息的格式化字符串

const date1 = moment
  .utc("2021-09-07T10:00:00Z")
  .tz("Europe/London")
  .format("YYYY-MM-DDTHH:mm:ssZ");

const date2 = moment
  .tz("2021-09-07T10:00:00Z", "Europe/London")
  .format("YYYY-MM-DDTHH:mm:ssZ");
  
console.log(date1); // "2021-12-07T11:00:00+01:00"
console.log(date2); // "2021-12-07T11:00:00+01:00"
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.33/moment-timezone-with-data-10-year-range.min.js"></script>

看。用tz()构建时间时;如果字符串中没有区域信息,则仅应用区域信息。否则,日期将转换为相应的区域。在这种情况下,日期会根据区域增加或减少(欧洲/伦敦增加 1 小时)。

最后一个sn-p中的date1date2是等价的,但是你应该注意区域信息,格式。如果您在不同区域之间进行转换,请始终尝试包含区域信息。将格式化字符串传递给构造函数也很好。它大大降低了失败的机会。

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2014-12-14
    • 2022-01-16
    • 2017-12-14
    • 2020-02-21
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多