鉴于时区问题的数量,我本以为能够找到这个问题的答案,但没有取得任何成功。
有没有办法使用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)。
答案 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,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