当使用JSON.stringify
方法将JavaScript对象转换成JSON字符串时,日期时间类型的值会被转换成字符串类型,而且格式并不符合ISO8601标准。例如,使用JSON.stringify
方法将new Date()
转换成JSON字符串时,会得到如下结果:
"2021-05-27T09:57:45.730Z"
其中,日期时间的格式是ISO格式化日期时间字符串,但是不符合严格模式(strict mode)。如果需要在程序中处理日期时间类型的值,并在不同语言之间进行传递或存储,需要符合ISO8601严格模式的日期时间字符串。例如:
"2021-05-27T09:57:45.730000Z"
该字符串是ISO8601严格模式下的日期时间格式化字符串,它显式地定义了毫秒级精度。如果需要将JavaScript的日期时间类型转换成符合ISO8601严格模式的字符串,可以使用toJSON()
函数。
const date = new Date();
const isoDate = date.toJSON();
console.log(isoDate); // "2021-05-27T09:57:45.730Z"
toJSON()
函数会将日期时间类型转换成ISO8601严格模式下的字符串格式。这里强调一下,toJSON()
返回的是UTC时间,而不是本地时间。如果要在本地时间的基础上进行转换,需要使用时差。
那么,当使用JSON.stringify
方法将JavaScript对象转换成JSON字符串时,如何保证日期时间类型的精度和格式呢?可以使用一个自定义的JSON序列化器(serializer),在序列化时处理日期时间类型的值。
const serializer = (key, value) => {
if (value instanceof Date) {
return value.toISOString(); // 转换成ISO8601严格模式下的字符串
}
return value;
};
const obj = {
message: 'Hello, World!',
timestamp: new Date()
};
const jsonString = JSON.stringify(obj, serializer);
console.log(jsonString);
示例输出结果:
{
"message": "Hello, World!",
"timestamp": "2021-05-27T09:57:45.730Z"
}
在自定义的JSON序列化器中,判断了值是否是日期时间类型,如果是,就使用toISOString()
方法将其转换成ISO8601严格模式下的字符串。其他类型的值则原样返回。
另外,需要注意的是,自定义的JSON序列化器对于嵌套的对象类型也适用。下面是一个嵌套对象的示例:
const serializer = (key, value) => {
if (value instanceof Date) {
return value.toISOString();
}
return value;
};
const obj = {
message: 'Hello, World!',
timestamp: new Date(),
content: {
title: 'Lorem ipsum',
created: new Date(),
updated: new Date()
}
};
const jsonString = JSON.stringify(obj, serializer);
console.log(jsonString);
输出结果如下:
{
"message": "Hello, World!",
"timestamp": "2021-05-27T09:57:45.730Z",
"content": {
"title": "Lorem ipsum",
"created": "2021-05-27T09:57:45.730Z",
"updated": "2021-05-27T09:57:45.730Z"
}
}
在该示例中,嵌套的对象中也包含日期时间类型的值,但是经过自定义的JSON序列化器处理之后,确保了日期时间类型的精度和格式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSON.stringify转换JSON时日期时间不准确的解决方法 - Python技术站