如何将日期转换为 ISO 格式,但用时区信息代替 Javascript 中的"Z"?



我一直使用以"Z"结尾的ISO格式的日期。但是现在我必须用时区信息替换"Z",例如+08:00.

换句话说,目前我有这种格式2020-01-17T00:30:00.000Z,但现在我需要这种格式2020-01-17T08:30:00+08:00.

看起来像流行的日期库,如moment,默认情况下dayjs将日期转换为没有"Z"的 ISO 格式。这是否仍被视为"ISO"日期格式?而且我找不到如何使用vanilla Javascript来做到这一点,并且做.toISOString()总是给我"Z"。

如果您获取 ISO 格式的日期字符串,但您希望获取特定时区的字符串以及时区。

然后这里有一个简单的函数可以做到这一点。

function getISODateStampWithTZ (date, tzHours) 
{
let dateTz = new Date(date);
dateTz.setUTCHours(tzHours);
return dateTz.toISOString().replace(/Z$/,
(tzHours<0 ? '-' : '+') +
(Math.abs(tzHours)<10 ? '0'+Math.abs(tzHours) : Math.abs(tzHours)) +
':00');
}
const date = new Date('2020-01-17T00:30:00.000Z');
console.log(date.toISOString());
console.log(getISODateStampWithTZ(date, 8));
console.log(getISODateStampWithTZ(date, -1));

这样的功能也可以添加到日期原型中。

下面的示例在函数前面加上"custom"前缀,以使其与标准方法区分开来。

Date.prototype.customToISOStringTZ = function  (tzHours) 
{
let dateTz = new Date(this);
dateTz.setUTCHours(tzHours);
return dateTz.toISOString().replace(/Z$/,
(tzHours<0 ? '-' : '+') +
(Math.abs(tzHours)<10 ? '0'+Math.abs(tzHours) : Math.abs(tzHours)) +
':00');
}
const date = new Date('2020-01-17T00:30:00.000Z');
console.log(date.toISOString());
console.log(date.customToISOStringTZ(8));
console.log(date.customToISOStringTZ(-1));

parser.isoparse('2019-08-28T14:34:25.518993Z'( 使用它来获得正确的格式

末尾的Z("祖鲁语"(表示UTC,即与UTC的偏移量为零。我假设您想从 UTC 转换为本地时间,在这种情况下,您需要计算 UTC 的偏移量:

function convertUTCDateToLocalDate(date) {
const newDate = new Date(date.getTime() + date.getTimezoneOffset() * 60 * 1000);
const offset = date.getTimezoneOffset() / 60;
const hours = date.getHours();
newDate.setHours(hours - offset);
return newDate;   
}

用法:

const date = new Date("2020-01-17T00:30:00.000Z")
const newDate = convertUTCDateToLocalDate(date)
newDate.toISOString() // "2020-01-17T01:30:00.000+01:00"

小心!此解决方案不适用于偏移量不是整小时的时区。

如果您在浏览器中运行它,我强烈建议您使用像moment这样的工具。

最新更新