JSON格式日期字符串转换全攻略:从解析到格式化,一文搞定
在前后端数据交互中,JSON(JavaScript Object Notation)作为轻量级的数据交换格式,被广泛应用于日期时间的传递,JSON本身并不原生支持日期类型,日期通常以字符串形式存储(如"2023-10-01T12:00:00Z"、"2023/10/01"等),这就需要我们在开发中对这些日期字符串进行转换——要么将其解析为编程语言原生支持的日期对象,要么将日期对象格式化为JSON兼容的字符串,本文将详细讲解JSON日期字符串的转换方法,涵盖不同编程语言(JavaScript/TypeScript、Python、Java)和常见场景,助你轻松应对日期处理的各类需求。
为什么需要转换JSON日期字符串?
JSON规范中,值可以是字符串、数字、布尔值、null、数组或对象,但没有专门的日期类型,当后端返回包含日期的数据时,前端收到的往往是类似这样的结构:
{
"orderDate": "2023-10-01T08:30:00",
"expireTime": "2023-10-08 23:59:59",
"timestamp": 1696115400000
}
这里的orderDate和expireTime是日期字符串,timestamp是时间戳(数字),如果不进行转换,直接用字符串进行日期计算、格式化显示或存储,可能会导致逻辑错误(如字符串比较"2023-10-02" < "2023-10-01"会返回true,显然不符合日期逻辑)。将JSON日期字符串转换为日期对象,或将日期对象转换为JSON日期字符串,是开发中必不可少的一步。
JSON日期字符串的常见格式
在转换前,先明确常见的JSON日期字符串格式,不同格式对应不同的解析方式:
| 格式示例 | 说明 |
|---|---|
2023-10-01T12:00:00Z |
ISO 8601格式,Z表示UTC时间(协调世界时),推荐标准格式 |
2023-10-01T12:00:00+08:00 |
ISO 8601扩展格式,+08:00表示UTC+8时区 |
2023/10/01 12:00:00 |
自定义分隔符格式,常见于部分后端系统 |
2023-10-01 |
仅日期部分(无时间),适用于仅需日期的场景 |
1675209600000 |
时间戳(毫秒/秒),数字形式,可直接转换为日期对象 |
主流语言中的JSON日期字符串转换方法
(一)JavaScript/TypeScript:原生API与库辅助
JavaScript中,日期处理主要通过Date对象和第三方库(如date-fns、moment.js,但moment.js已不推荐新项目使用)实现。
将JSON日期字符串转换为Date对象
ISO 8601格式(推荐):
ISO 8601格式的字符串可直接传递给Date构造函数,浏览器和Node.js会自动解析:
const isoString = "2023-10-01T12:00:00Z"; const date = new Date(isoString); console.log(date); // 输出:Sun Oct 01 2023 20:00:00 GMT+0800 (中国标准时间) // 注意:Z表示UTC,会自动转换为本地时区(北京时间UTC+8)
自定义格式(如"2023/10/01 12:00:00"):
自定义格式无法直接解析,需先通过字符串分割提取年、月、日、时、分、秒,再构造Date对象(注意:JavaScript中Date的月份从0开始,0代表1月):
const customString = "2023/10/01 12:00:00";
const [datePart, timePart] = customString.split(" ");
const [year, month, day] = datePart.split("/").map(Number);
const [hour, minute, second] = timePart.split(":").map(Number);
const date = new Date(year, month - 1, day, hour, minute, second);
console.log(date); // 输出:Sun Oct 01 2023 12:00:00 GMT+0800 (中国标准时间)
时间戳格式:
数字时间戳可直接通过new Date()转换为Date对象(JavaScript中时间戳默认为毫秒):
const timestamp = 1696115400000; // 毫秒时间戳 const date = new Date(timestamp); console.log(date); // 输出:Sun Oct 01 2023 12:30:00 GMT+0800 (中国标准时间)
将Date对象转换为JSON日期字符串
JavaScript中,Date对象有内置的toISOString()方法,返回ISO 8601格式的UTC时间字符串(推荐用于JSON序列化):
const date = new Date(); const isoString = date.toISOString(); console.log(isoString); // 输出:2023-10-01T12:30:00.123Z(示例,实际值随当前时间变化)
如果需要本地时间格式,可手动拼接:
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hour = String(date.getHours()).padStart(2, "0");
const minute = String(date.getMinutes()).padStart(2, "0");
const localString = `${year}-${month}-${day} ${hour}:${minute}`;
console.log(localString); // 输出:2023-10-01 20:30(示例,本地时间)
使用JSON.stringify时的日期处理
默认情况下,JSON.stringify会将Date对象转换为ISO 8601格式的字符串:
const data = {
name: "订单",
createTime: new Date()
};
console.log(JSON.stringify(data));
// 输出:{"name":"订单","createTime":"2023-10-01T12:30:00.123Z"}
如果希望自定义JSON中的日期格式,可以使用replacer参数:
function dateReplacer(key, value) {
if (value instanceof Date) {
return value.toISOString().slice(0, 19).replace("T", " "); // 转换为"YYYY-MM-DD HH:mm:ss"
}
return value;
}
console.log(JSON.stringify(data, dateReplacer));
// 输出:{"name":"订单","createTime":"2023-10-01 12:30:00"}
(二)Python:datetime模块与json模块结合
Python中,日期时间处理主要依赖datetime模块,JSON序列化/反序列化需结合json模块,并通过default和object_hook参数处理日期对象。
将JSON日期字符串转换为datetime对象
使用datetime.datetime.fromisoformat()可直接解析ISO 8601格式字符串(Python 3.7+支持):
from datetime import datetime iso_string = "2023-10-01T12:00:00+08:00" dt = datetime.fromisoformat(iso_string) print(dt) # 输出:2023-10-01 12:00:00+08:00
对于非ISO格式(如"2023/10/01 12:00:00"),需用datetime.strptime手动解析:
from datetime import datetime custom_string = "2023/10/01 12:00:00" dt = datetime.strptime(custom_string, "%Y/%m/%d %H:%M:%S") print(dt) # 输出:2023-10-01 12:00:00
将datetime对象转换为JSON日期字符串
Python的json模块无法直接序列化datetime对象,需通过default参数指定转换函数,推荐转换为ISO 8601格式:
from datetime import datetime
import json
dt = datetime.now()
json_str = json.dumps({"time": dt}, default=lambda x: x.isoformat())
print(json_str) # 输出:{"time":"2023-10-01T12:30:00.123456"}
如果需要自定义格式,可在default函数中处理:
def datetime_converter(x):
if isinstance(x, datetime):
return x.strftime("%Y-%m-%d %H:%M:%S")
raise TypeError("Object of non-serializable type")
json_str = json.dumps({"time": dt}, default=datetime_converter)
print(json_str) # 输出:{"time":"2023-10-01 12


还没有评论,来说两句吧...