使用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