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

时间:2014-01-24 18:39:00

标签: javascript momentjs datetimeoffset

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

我想

  • a)使用UTC http://goo.gl/JTfAZq的时间偏移在ISO 8601中对其进行格式化,因此它变为“2014-01-22T14:07:00-08:00”
  • b)去除时间偏移部分,使其变为“01/22/2014 2:07:00 PM”[然后在ISO 8601中格式化,使其变为“2014-01-22T14:07:00”] < / LI>

当然我可以使用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)不存在更优雅稳定的解决方案?

1 个答案:

答案 0 :(得分:7)

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

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

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");