创建包含时区标识符的新日期对象

时间:2014-04-03 03:00:19

标签: javascript facebook iso

我从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字符串,看看是否需要删除时区标识符,因为我正在处理数百个事件。

有没有更简单的方法来做我正在尝试的事情,或者我是否真的需要删除每个日期的时区标识符?

1 个答案:

答案 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 )。

编辑2

仅限日期格式(将其视为UTC)。