MomentJS Timezone返回错误的日期和时间

时间:2017-08-09 23:22:54

标签: timezone momentjs

我正在使用moment.js和moment-timezone-with-data.min.js来计算日期时间。

我使用的日期/时间如下:

var dGC2018 = moment('2018-04-04T18:00:00').tz("Australia/Queensland");

日期是2018年4月4日。时间是下午6点。时区是昆士兰州。

输出(使用console.log)是:

Thu Apr 05 2018 04:00:00 GMT+1000 (E. Australia Standard Time) {}

可以通过将dCG2018输出到console.log并展开返回的对象以查找_d属性来找到此输出。

为什么momentjs声明相对于输入参数的错误日期/时间?

2 个答案:

答案 0 :(得分:1)

您必须使用moment.tz而不是tz功能。 moment.tz使用给定的时区解析您的输入字符串(在您的情况下为'Australia/Queensland')。

您输入错误是因为您正在使用本地时区解析字符串(如所述here默认情况下,会按当地时间分析并显示。)然后转换它到'Australia/Queensland'时区。

此外,您不必使用_d和其他内部属性来获取时刻对象的值。正如momentjs官方指南的Internal Properties部分所述:

  

Moment对象具有多个以_为前缀的内部属性。

     

最常见的内部属性是_d属性,它包含Moment包装器的JavaScript日期。通常,开发人员对控制台输出_d的值感到困惑。 Moment使用一种称为epoch移位的技术,该技术有时会使该属性与Moment反映的实际日期值不同。特别是如果正在使用Moment TimeZone,则此属性几乎不会与Moment从其公共.format()函数输出的实际值相同。因此,_d和任何其他以_为前缀的属性的值不应用于任何目的。

     

要打印出片刻的价值,请使用.format().toString().toISOString()

这是一份工作样本:

var dGC2018 = moment.tz('2018-04-04T18:00:00', "Australia/Queensland");
console.log(dGC2018.format())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data-2012-2022.min.js"></script>

答案 1 :(得分:0)

我认为这里可能没有考虑到偏移量。尝试使用以下代码段并查看它是否适合您,修改dateValue和时刻时区值以符合您的需求:

var localTimeZoneMoment = moment(dateValue);
var userTimeZoneMoment = localTimeZoneMoment.clone();
userTimeZoneMoment.tz('Australia/Queensland');
userTimeZoneMoment.add(localTimeZoneMoment.utcOffset() - userTimeZoneMoment.utcOffset(), 'minutes');

var  formattedLocalTime = moment.tz(userTimeZoneMoment, 'Australia/Queensland').format('ddd, DD-MMM-YYYY hh:mm a')