如何在JavaScript中将短日期格式转换为ISO日期且不修改日期值?
JavaScript 转换短日期为ISO格式(仅保留原日期)
问题场景
从接口请求返回的数据里,ReceivedDate字段是"26/12/2022"(日/月/年)格式的短日期,需要将其转换为2022-12-26的ISO日期格式,但当前直接用new Date()会生成当前时间,完全不符合需求,要实现只改格式、不改动原日期的转换。
请求代码
const { data } = await axios.post(`${ur}`, body_object);
响应示例
"ReceivedDate": "26/12/2022"
当前错误代码
data.ReceivedDate = new Date(); console.log(data.ReceivedDate) // 输出: 2023-03-21T00:38:39.169Z
期望输出
2022-12-26
可行方案
方案1:拆分字符串手动拼接(最稳妥,无时区问题)
直接拆分原始日期字符串的日、月、年部分,再按ISO格式拼接,完全规避Date构造函数的时区和解析歧义问题:
const rawDate = data.ReceivedDate; // 按斜杠分割为日、月、年 const [day, month, year] = rawDate.split('/'); // 补零后拼接成yyyy-mm-dd格式 data.ReceivedDate = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`; console.log(data.ReceivedDate); // 输出: 2022-12-26
padStart(2, '0')用于确保月份和日期始终是两位数字,比如5/3/2023会被转为2023-03-05。
方案2:构造Date对象后提取日期(需注意时区)
如果需要生成Date对象再转换格式,要正确传入年、月、日参数(注意JavaScript的月份是从0开始计数的,所以要减1):
const rawDate = data.ReceivedDate; const [day, month, year] = rawDate.split('/'); // 构造正确的Date对象,月份减1 const dateInstance = new Date(year, month - 1, day); // 转换为ISO字符串后截取前10位 data.ReceivedDate = dateInstance.toISOString().slice(0, 10); console.log(data.ReceivedDate); // 输出: 2022-12-26
⚠️ 注意:这种方法受时区影响,如果你的运行环境时区与目标日期的时区不一致,可能会出现日期偏移(比如UTC-8时区下,本地日期可能被解析为前一天的UTC时间,导致toISOString()输出错误日期),所以优先推荐方案1。
内容的提问来源于stack exchange,提问作者Juan J
相关产品推荐
相关产品推荐

