moment.tz给出了错误的结果

时间:2017-07-10 10:18:17

标签: timezone momentjs

我试图根据所选时区转换日期。我惊讶地看到5分钟时差的日期相同的结果。 例如,

var x = "2017-07-10T18:30:00.000Z"
var y = "2017-07-10T18:35:00.000Z"
var z = "2017-07-10T18:45:00.000Z"

并尝试将它们转换为使用moment.tz:

moment.tz(x, 'America/New_York').format('DD/MM/YYYY HH:MM:SS');
moment.tz(y, 'America/New_York').format('DD/MM/YYYY HH:MM:SS')
moment.tz(z, 'America/New_York').format('DD/MM/YYYY HH:MM:SS')

令我惊讶的是,所有3个"10/07/2017 14:07:00"的结果都相同。 出了什么问题?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

简答:

问题是您在format()使用大写MM(月)而不是小写mm分钟。请注意,SS(小数秒)和ss(秒)存在同样的问题。

关于代码示例的一般说明:

使用moment.tz使用给定时区解析时间字符串(例如'America/New_York'),moment.tz不会将输入转换为给定时区。

您必须使用tz()方法将时刻对象转换为给定时区。

请注意,您的输入字符串以Z结尾,因此它表示UTC时间。

正如Matt Johnson在评论中指出的那样,在您的情况下,即使moment.tz(input, zone)也会将输入转换为给定区域,因为输入字符串包含Z(保留为UTC时区)。无论如何,这种方法是不鼓励的。

这是一个parses UTC时间字符串并将其转换为'America/New_York'时区的代码示例:



var x = "2017-07-10T18:30:00.000Z";
var y = "2017-07-10T18:35:00.000Z";
var z = "2017-07-10T18:45:00.000Z";

console.log( moment.utc(x).tz('America/New_York').format('DD/MM/YYYY HH:MM:SS') );
console.log( moment.utc(y).tz( 'America/New_York').format('DD/MM/YYYY HH:mm:ss') );
console.log( moment.utc(z).tz( 'America/New_York').format('DD/MM/YYYY HH:mm:ss') );

<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>
&#13;
&#13;
&#13;