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

vke*_*man 6 javascript datetimeoffset momentjs

假设我有一个像"01/22/2014 2:07:00 PM -08:00"这样的字符串.

我想要

  • a)将其格式化为ISO 8601,时间偏离UTC http://goo.gl/JTfAZq,因此变为"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")
Run Code Online (Sandbox Code Playgroud)

我知道JavaScript Date()对象不是为了保留时区而设计的,但是a)和b)不存在更优雅和稳定的解决方案吗?

Mat*_*int 7

我想你在找moment.ParseZone.它解析片刻并保留字符串中的时区偏移量,而不是将其转换为浏览器的本地时区.

此外,您的myDateTime变量与您询问的内容不符.如果你确实已经有一个完整的ISO8601扩展时区offfset,那么它是这样的:

var m = moment.parseZone("2014-01-22T14:07:00-08:00");
Run Code Online (Sandbox Code Playgroud)

或者,如果它像你原来那样展示,那就像这样:

var m = moment("01/22/2014 2:07:00 PM -08:00",
               "MM/DD/YYYY h:mm:ss A Z").parseZone();
Run Code Online (Sandbox Code Playgroud)

从那里,你可以格式化它,但你喜欢:

var s = m.format("YYYY-MM-DDTHH:mm:ss");
Run Code Online (Sandbox Code Playgroud)