使用JavaScripty、Moment.js等从字符串中剥离时区?

使用JavaScripty、Moment.js等从字符串中剥离时区?,javascript,momentjs,datetimeoffset,Javascript,Momentjs,Datetimeoffset,假设我有一个字符串,如“01/22/2014 2:07:00 PM-08:00” 我想 a) 在ISO 8601中使用UTC的时间偏移对其进行格式化,使其成为“2014-01-22T14:07:00-08:00” b) 去掉时间偏移部分,使其成为“01/22/2014 2:07:00 PM”[然后在ISO 8601中格式化,使其成为“2014-01-22T14:07:00”] 当然,我可以使用JavaScript字符串函数(和正则表达式),但使用JavaScript Date()对象工具或M

假设我有一个字符串,如“01/22/2014 2:07:00 PM-08:00”

我想

  • a) 在ISO 8601中使用UTC的时间偏移对其进行格式化,使其成为“2014-01-22T14:07:00-08:00”
  • b) 去掉时间偏移部分,使其成为“01/22/2014 2:07:00 PM”[然后在ISO 8601中格式化,使其成为“2014-01-22T14:07:00”]
当然,我可以使用JavaScript字符串函数(和正则表达式),但使用JavaScript Date()对象工具或Moment.js似乎是更好的方法。然而,这两种方法都不管用。两者都会自动将日期转换为当前系统时区(-05:00),因此下午2:07变为下午5:07。我找到了两种方法来完成“去掉时间偏移量,然后格式化”任务,但这两种方法看起来都很丑陋和脆弱:

var mydateTime = "01/22/2014 2:07:00 PM -08:00";

// strip out time offset part using substring() so that Moment.js
// would think time is specified in a current zone
var myNewDateTime1 = moment(mydateTime.substring(0, mydateTime.length - 7)).format("YYYY-MM-DDTHH:mm:ss")

// or probably even worse trick - strip out time offset part using format
var myNewDateTime2 = moment(mydateTime, "MM/DD/YYYY h:mm:ss A").format("YYYY-MM-DDTHH:mm:ss")

我知道JavaScript Date()对象不是为了保留时区而设计的,但对于a)和b)来说,没有更优雅、更稳定的解决方案了。

我想您正在寻找。它解析该时刻并保留字符串中的时区偏移,而不是将其转换为浏览器的本地时区

另外,您的
myDateTime
变量与您询问的内容不匹配。如果您确实已经有一个完整的ISO8601扩展,并带有OFFSET时区,则如下所示:

var m = moment.parseZone("2014-01-22T14:07:00-08:00");
var m = moment("01/22/2014 2:07:00 PM -08:00",
               "MM/DD/YYYY h:mm:ss A Z").parseZone();
或者如果它像你最初展示的那样,那么像这样:

var m = moment.parseZone("2014-01-22T14:07:00-08:00");
var m = moment("01/22/2014 2:07:00 PM -08:00",
               "MM/DD/YYYY h:mm:ss A Z").parseZone();
从那里,您可以按照自己的喜好对其进行格式化:

var s = m.format("YYYY-MM-DDTHH:mm:ss");

我试图编辑我的评论太长时间了,所以我只是删除了它。根据您链接的文档,Matt,moment.parseZone没有第二个参数。正在尝试将解析为矩.parseZone(“2014年1月22日下午2:07:00-08:00”,“年/月/日h:MM:ss A Z”)或矩.parseZone(“2014年1月22日下午2:07:00-08:00”);两者都返回_d:Invalid date您是对的!接得好!改用我更新的答案中的语法。我将为另一个提交一个bug。“你的myDateTime变量与你所问的不匹配。”Matt,我修改了我的帖子来解决这个问题,谢谢。这是一个简单直接的解决方案的完美答案。我喜欢这一点,因为这意味着不需要创建一个新的var,其中包含一个去掉时区的新日期。太简单了!力矩(“2017-03-22T09:07:19.000-0400”).parseZone()格式(“MMM D,YYYY”)