假设我有一个像“01/22/2014 2:07:00 PM -08: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)不存在更优雅稳定的解决方案?
答案 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");