我从Facebook的API查询事件开始时间。大多数情况下,他们返回字符串,如下所示:
2014-04-02T20:00:00-0600
但有时,它会像:
一样返回2014-04-19
当我尝试创建新的日期对象时,它不适用于时区标识符。
然而,这两项工作都是:
var d = new Date('2014-04-02T20:00:00')
或
var d = new Date('2014-04-19')
但我需要这个工作:
var d = new Date('2014-04-02T20:00:00-0600')
// returns Invalid Date
我正在尝试避免解析每个start_time字符串,看看是否需要删除时区标识符,因为我正在处理数百个事件。
有没有更简单的方法来做我正在尝试的事情,或者我是否真的需要删除每个日期的时区标识符?
答案 0 :(得分:0)
您可以使用以下方法解析带偏移量的ISO 8601字符串。如果字符串没有偏移量,则假定为Z(即每ECMA-262的UTC):
/* Parse an ISO string with an offset
** e.g. '2014-04-02T20:00:00-0600'
** '2014-04-02T20:00:00Z'
**
** Allows decimal seconds if supplied
** e.g. '2014-04-02T20:00:00.123-0600'
**
** If no offset is supplied (or it's Z), treat as UTC (per ECMA-262)
** If date only, e.g. '2014-04-02', treat as UTC date (per ECMA-262)
*/
function parseISOString(s) {
var t = s.split(/\D+/g);
var hasOffset = /\d{2}[-+]\d{4}$/.test(s);
// Whether decimal seconds are present changes the offset field and ms value
var hasDecimalSeconds = /T\d{2}:\d{2}:\d{2}\.\d+/i.test(s);
var offset = hasDecimalSeconds? t[7] : t[6];
var ms = hasDecimalSeconds? t[6] : 0;
var offMin, offSign, min;
// If there's an offset, apply it to minutes to get a UTC time value
if (hasOffset) {
offMin = 60 * offset / 100 + offset % 100;
offSign = /-\d{4}$/.test(s)? -1 : 1;
}
min = hasOffset? +t[4] - offMin * offSign : (t[4] || 0);
// Return a date object based on UTC values
return new Date(Date.UTC(t[0], --t[1], t[2], t[3]||0, min, t[5]||0, ms));
}
// Tests
console.log(parseISOString('2014-04-02T20:00:00-0600').toISOString()); // 2014-04-03T02:00:00.000Z
console.log(parseISOString('2014-04-02T20:00:00Z').toISOString()); // 2014-04-02T20:00:00.000Z
console.log(parseISOString('2014-04-02T20:00:00').toISOString()); // 2014-04-02T20:00:00.000Z
console.log(parseISOString('2014-04-02T20:00:00.123-0600').toISOString());// 2014-04-03T02:00:00.123Z
console.log(parseISOString('2014-04-02T20:00:00.123').toISOString()); // 2014-04-02T20:00:00.123Z
console.log(parseISOString('2014-04-02').toISOString()); // 2014-04-02T00:00:00.000Z
请注意,如果这将根据系统设置创建一个日期对象,其中包含主机环境时区的偏移量。 Date的时间值将是所提供时间戳的等效UTC时间(在本例中为“2014-04-03T02:00:00Z”)。您可以使用 toISOString 方法确认(需要IE9或更高版本,或其他现代浏览器)。
请注意,您无法设置Date对象的时区偏移量。它们具有表示UTC时刻的时间值,以及基于系统设置的时区偏移。您可以使用标准日期方法(如 getFullYear 和 getHours )读取“本地”日期和时间值,如果使用UTC方法,则可以读取UTC值(例如 getUTCFullYear , getUTCHours )。
仅限日期格式(将其视为UTC)。