2017-08-09 102 views
0

我正在使用moment.js和moment-timezone-with-data.min.js来计算日期时间。MomentJS时区返回的日期和时间不正确

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

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

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

输出(使用的console.log)是:

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

该输出可以通过输出dCG2018console.log和扩大返回的对象找到_d属性中找到。

为什么momentjs指出与我的输入参数相关的不正确日期/时间?

回答

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') 
+0

感谢@VincenzoC的格式编辑,我是很新的回答对计算器。 – bharathkola

+1

一般来说,不应该加/减去调整偏移量。这样做会影响时间点。 –

1

你必须使用moment.tz而不是tz功能。 moment.tz使用给定的时区分析您的输入字符串(在您的案例中为'Australia/Queensland')。

你得到了错误的输出,因为你正在使用解析本地时区中的字符串(如表示here默认情况下,那一刻,分析并显示在当地时间),然后将其转换为'Australia/Queensland'时区。

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

瞬间对象有几个内部属性,前缀为_

最常见的内部属性是_d属性,该属性包含Moment包装器的JavaScript日期。通常,开发人员通过控制台输出值_d而感到困惑。 Moment使用了一种称为时代转换的技术,导致该属性有时与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>

相关问题