GMT之后的Momentjs日期格式处理(CEST)

时间:2017-04-28 15:04:11

标签: javascript momentjs

您好我已经阅读了文档,我只是想确定我得到的日期是否正确处理了“GMT + 0200(CEST)”之后的时间。这是我的代码:ouput:

var date= moment("Mon Mar 27 2017 18:44:35 GMT+0200 (CEST)", "ddd MMM D YYYY HH:mm:ss 1").format()

console.log(date)
//output:
//2017-03-27T18:44:35+02:00
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

2 个答案:

答案 0 :(得分:3)

不,您的格式字符串无法正确处理偏移量。

moment(String)解析函数(请注意,只有一个参数)接受ISO 8601和RFC 2822字符串。此函数不使用format参数,因此无需在任何地方使用1。无论如何,您的输入不符合RFC 2822,因为日期是月份名称。如果您使用moment(String),您将在控制台中获得 Deprecation Waring ,如下面的代码所示:

var date= moment("Mon Mar 27 2017 18:44:35 GMT+0200 (CEST)").format();
console.log(date);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

以前代码的结果在浏览器中是不一致的,因为docs表示:

  

警告:浏览器对解析字符串的支持不一致。因为没有关于应该支持哪种格式的规范,所以在某些浏览器中有效的功能在其他浏览器中不起作用。

正如我之前在评论中所建议的那样,您可以使用ZZ令牌( UTC的偏移量为+-HH:mm+-HHmm,使用时间String + Format解析功能,或Z )以考虑UTC偏移。

在您的情况下,您可以将moment.utcZZ / Z令牌)与local()功能合并,以正确解析您的输入:

var date= moment.utc("Mon Mar 27 2017 18:44:35 GMT+0200 (CEST)", "ddd MMM D YYYY HH:mm:ss ZZ");
// Local date, but considering input offset
console.log(date.local().format());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

请注意,我的解决方案与您在帐户偏移字符串中所采用的不同,您可以使用unix()方法对其进行测试,如下所示(如果您是UTC+2则更改环境偏移量):

var myDate = moment.utc("Mon Mar 27 2017 18:44:35 GMT+0200 (CEST)", "ddd MMM D YYYY HH:mm:ss ZZ");
console.log(myDate.unix()); // 1490633075

var yourDate= moment("Mon Mar 27 2017 18:44:35 GMT+0200 (CEST)", "ddd MMM D YYYY HH:mm:ss 1");
console.log(yourDate.unix()); // output depends on browser offset

var targetDate = moment.utc("2017-03-27 16:44:35");
console.log(targetDate.unix()); // 1490633075
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

作为进一步的参考,您可以查看指出的Time Zone vs Offset指南:

  

Moment.js核心库提供与根据偏移值调整时间相关的功能。它不支持根据时区数据调整日期 - 这是由Moment TimeZone库提供的。

答案 1 :(得分:2)

要回答这个问题:不,您的格式字符串无法正确处理时区字符串。如果我在我的时区(GMT + 0100)中运行您的示例代码,我得到的结果是:2017-03-27T18:44:35+01:00 - 即看起来时刻完全忽略了时区,并且只使用本地时区。 / p>

证明:

&#13;
&#13;
var date= moment("Mon Mar 27 2017 18:44:35 GMT-0700 (MST)", "ddd MMM D YYYY HH:mm:ss it doesn't matter what I write here").format()

console.log(date)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
&#13;
&#13;