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

Eri*_* B. 18 javascript datetime momentjs

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

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

例如,如果我在EDT时区:

var x = moment( "2012-12-31T00:00:00+0000" );
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*int 11

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

也许你只是在寻找一种方法来保留它给出的时区?如果是,则使用该moment.parseZone功能.例如:

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

你也可以实现这个目标moment.utc.区别在于moment.parseZone将保留您提供的任何偏移量,而moment.utc如果您给它一个非零偏移量,则将调整为UTC.

  • 你有一个很好的理由想要这样做。生日。服务器将属性生日日期时间设置为午夜的用户发送。用户根本不关心他们所在的时区或任何事情。很容易将所有日期以 UTC 格式存储在您的数据库中,并使网络服务器使用 ISO-8601 中的 UTC 修改所有出站日期。但是很难做到这一点并且修改对象的单个属性以不将时区属性添加到值中。 (2认同)

Mar*_*ark 9

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

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

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


小智 5

我知道我迟到了,我有同样的问题,我的搜索并没有让我更接近.我分解并阅读了文档,并且有一个关于String + Format的选项:

字符串+格式文档

moment(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
Run Code Online (Sandbox Code Playgroud)

给我暂停的部分是用来解析当地时间的例子省略了+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
Run Code Online (Sandbox Code Playgroud)


kha*_*d13 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"
Run Code Online (Sandbox Code Playgroud)