Skip to content

使用JavaScript将日期格式化为带有时区的ISO字符串

ISO 8601 标准定义了日期和时间的格式。它被广泛应用于世界各地的各个领域,从商业到科学。

该格式的日期表示为以下两种形式之一:

  • YYYY-MM-DDTHH:mm:ss.sssZ(UTC时间)
  • YYYY-MM-DDTHH:mm:ss.sss±hh:mm(带有时区偏移量的本地时间)

让我们看看如何使用JavaScript将日期转换为这两种格式之一。

将日期格式化为ISO字符串(UTC时间)

JavaScript内置的Date.prototype.toISOString()方法将日期转换为UTC时间的ISO字符串。

const toISOString = date => date.toISOString();

toISOString(
  new Date('2024-01-06T19:20:34+02:00')
); // '2024-01-06T17:20:34.000Z'

将日期格式化为带有时区偏移量的ISO字符串

为了包含时区偏移,你需要自己构建字符串。

为此,你需要知道日期的时区偏移量,可以使用Date.prototype.getTimezoneOffset()来获取。返回的值是以分钟为单位的,所以你需要将其转换为小时和分钟。它还会对正偏移返回负值,所以你需要反转符号

此外,你还需要手动使用String.prototype.padStart()将值填充为2位数。使用这个方法,结合时区偏移和Date的内置方法,你可以构建带有时区偏移的ISO 8601字符串。

// 将数字填充为2位数
const pad = n => `${Math.floor(Math.abs(n))}`.padStart(2, '0');
// 获取ISO格式的时区偏移量(+hh:mm 或 -hh:mm)
const getTimezoneOffset = date => {
  const tzOffset = -date.getTimezoneOffset();
  const diff = tzOffset >= 0 ? '+' : '-';
  return diff + pad(tzOffset / 60) + ':' + pad(tzOffset % 60);
};

const toISOStringWithTimezone = date => {
  return date.getFullYear() +
    '-' + pad(date.getMonth() + 1) +
    '-' + pad(date.getDate()) +
    'T' + pad(date.getHours()) +
    ':' + pad(date.getMinutes()) +
    ':' + pad(date.getSeconds()) +
    getTimezoneOffset(date);
};

toISOStringWithTimezone(
  new Date('2024-01-06T19:20:34+02:00')
); // '2024-01-06T19:20:34+02:00'

检查字符串是否为ISO格式的日期

与将日期转换为ISO格式一样,你可能还需要检查一个字符串是否为有效的ISO格式日期。知道如何将日期转换为ISO格式后,你可以简单地将结果与原始字符串进行比较。

使用Number.isNaN()检查无效日期,并使用Date构造函数进行日期转换,你就可以了。

const isISOString = val => {
  const d = new Date(val);
  return !Number.isNaN(d.valueOf()) && d.toISOString() === val;
};

```javascript
const isISOStringWithTimezone = val => {
  const d = new Date(val);
  return !Number.isNaN(d.valueOf()) && toISOStringWithTimezone(d) === val;
};

isISOString('2020-10-12T10:10:10.000Z'); // true
isISOString('2020-10-12'); // false
isISOStringWithTimezone('2020-10-12T10:10:10+02:00'); // true
isISOStringWithTimezone('2020-10-12T10:10:10.000Z'); // false
const isISOStringWithTimezone = val => {
  const d = new Date(val);
  return !Number.isNaN(d.valueOf()) && toISOStringWithTimezone(d) === val;
};

isISOString('2020-10-12T10:10:10.000Z'); // true
isISOString('2020-10-12'); // false
isISOStringWithTimezone('2020-10-12T10:10:10+02:00'); // true
isISOStringWithTimezone('2020-10-12T10:10:10.000Z'); // false