我正在使用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声明相对于输入参数的错误日期/时间?
答案 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')