MomentJS时区将返回不正确的日期和时间(MomentJS Timezone is return

2019-09-29 08:45发布

我使用moment.js和时刻,时区与 - data.min.js来计算日期时间。

日期/时间我使用如下:

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说明相对于我的输入参数不正确的日期/时间?

Answer 1:

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

(如说,因为你是使用解析本地时区的字符串你得到了错误的输出这里 : 默认情况下,时刻解析并在本地时间显示),然后将其转换为'Australia/Queensland'时区。

此外,您不必使用_d和其他内部propertries得到片刻对象的值。 正如所陈述的内部属性 momentjs官方指南的部分:

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

最常看到内部属性是_d持有的javascript日期的那一刻包装财产。 通常情况下,开发商是由价值的控制台输出混淆_d 。 时刻使用称为划时代的换档技术导致此属性有时与实际日期值的时刻反映不同。 尤其是,如果瞬间时区是在使用中,此属性将几乎永远是一样的实际值瞬间会从它的公共输出.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> 



Answer 2:

我认为偏移量可能不是占了这里。 尝试使用下面的代码片段,看看它是否适合你,修改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')


文章来源: MomentJS Timezone is returning incorrect date and time