有没有办法使用Moment.js解析时间字符串但忽略时区信息?

时间:2014-08-21 14:55:10

标签: javascript datetime momentjs

鉴于时区问题的数量,我本以为能够找到这个问题的答案,但没有取得任何成功。

有没有办法使用moment.js来解析ISO-8601字符串,但是在我的本地timzeone中解析了它?基本上我想忽略ISO字符串中提供的时区信息。

例如,如果我在EDT时区:

var x = moment( "2012-12-31T00:00:00+0000" );

会给我:     " 2012-12-30T19:00:00-5000"

我想忽略时区信息,只是让它给我一个相当于" 2012-12-31T00:00:00-5000"当地时间(EDT)。

9 个答案:

答案 0 :(得分:10)

我认为你真的不想忽略偏移量。这最终只会替换你在当地时区提供的偏移 - 这将导致一个完全不同的时刻。

也许你只是想找到一种方法来保留它所给予的时区?如果是,则使用moment.parseZone函数。例如:

var m = moment.parseZone("2012-12-31T00:00:00+0000");
var s = m.format();   // "2012-12-31T00:00:00+00:00"

您也可以使用moment.utc实现此目的。区别在于moment.parseZone将保留您给出的任何偏移量,而moment.utc如果给它一个非零偏移量将调整为UTC。

答案 1 :(得分:8)

我通过提供格式作为第二个参数,并使用Moment的escaping characters方法并在时区周围包裹方括号来解决这个问题。

moment("2016-01-01T05:00:00-05:00", "YYYY-MM-DDTHH:mm:ss[Z]").startOf("hour").format()

这仍将使用您的本地时区创建时刻对象,但它不会执行任何类型的自动时区计算。因此,无论提供何种时区,上面的例子都会给你5分钟。

答案 2 :(得分:5)

我知道我迟到了,我有同样的问题,我的搜索并没有让我更接近。我分解并阅读了文档,并且有一个选项可以在一个字符串+格式:

String + Format docs

  

时刻(String,String);

     

moment(String,String,String);

     

moment(String,String,Boolean);

     

moment(String,String,String,Boolean);

还有更多的话,那就是:

  

除非您指定时区偏移量,否则解析字符串将在当前时区中创建日期。

moment("2010-10-20 4:30",       "YYYY-MM-DD HH:mm");   // parsed as 4:30 local time
moment("2010-10-20 4:30 +0000", "YYYY-MM-DD HH:mm Z"); // parsed as 4:30 UTC

让我暂停的部分是用来解析当地时间的例子省略了+ 0000,这导致我认为输入字符串需要删除,但它没有。

示例:

var time = "2012-12-31T00:00:00+0000";
var x = moment(time); // Sun Dec 30 2012 19:00:00 GMT-0500
var y = moment(time,'YYYY-MM-DD'); //Mon Dec 31 2012 00:00:00 GMT-0500

答案 3 :(得分:3)

如果您确定您的输入字符串是ISO-8601格式,您可以删除最后5位数字并在Moment构造函数中使用它。

var input = "2012-12-31T00:00:00+0000"
input = input.substring(0, input.length-5)
moment(input).toString()
> "Mon Dec 31 2012 00:00:00 GMT-0600"

答案 4 :(得分:2)

有充分的理由去做OP要求的事情。使用Moment执行此操作的最简单方法是使用其parseZone(date)方法。没有任何关于字符串操作或多次调用的信息。它有效地解析日期字符串,就像它在浏览器的本地时区一样。

答案 5 :(得分:1)

您可以使用moment.utc()代替moment()创建新时刻,完全忽略浏览器的时区。

例如,如果您尝试纯粹使用浏览器当前时间的UTC日期/时间但想要丢弃其时区数据,则可以使用以下内容将浏览器的当前时间重新创建为UTC格式:

let nowWithTimezone = moment();
let nowInUtc = moment.utc(nowWithTimezone.format('MM/DD/YYYY HH:mm'), 'MM/DD/YYYY HH:mm');

关于moment.utc()的进一步文档:https://momentjs.com/docs/#/parsing/utc/

答案 6 :(得分:0)

最好的方法是使用:

dt = moment("Wed Sep 16 2015 18:31:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400",true);

并再次显示转换为所需的时区:

 dt.utcOffset("-04:00").toString()
 output > Wed Sep 16 2015 18:31:00 GMT-0400

答案 7 :(得分:0)

使用MomentJS这是一项艰巨的任务,它基本上也取决于你当前的时区。

这个特定任务的文档也很模糊,我解决这个问题的方法是在将日期转换为JSON格式之前加上几个小时。

var dt = moment("Sun Sep 13 2015 00:00:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400", false);
var date = dt.add(2, 'hour').toJSON();
console.log(date); //2015-09-13T00:00:00.000Z

答案 8 :(得分:0)

使用moment.parseZone进行转换,而无需考虑时区。

const moment = require('moment')

const dateStr = '2020-07-21T10:00:00-09'

const date = moment.parseZone(dateStr)

console.log(date.format('MM-DD-YY HH:mm A')) // 07-21-20 10:00 AM

Try here link to docs