如何将本地化日期转换为Date对象?求正确实现方法
嘿,我来帮你理清这个问题——你当前用new Date(new Date().toLocaleString())的方式其实不太靠谱,原因在于toLocaleString()的输出格式是依赖运行环境的地区设置的,不同浏览器、不同操作系统可能返回完全不同格式的字符串,而Date构造函数解析这类本地化字符串的行为并没有统一标准,很容易出现解析错误或者时区处理偏差。
1. 直接获取当前时间的Date对象(最常见场景)
如果你的需求只是获取当前时间的Date对象,完全不需要经过toLocaleString()转换!new Date()本身就已经包含了完整的时间和时区信息,它的toString()或者toLocaleString()方法只是把内部的时间值(时间戳)转换成不同格式的字符串展示而已。比如:
const now = new Date(); // 这就是你需要的Date对象 console.log(now.toLocaleString()); // 输出本地化格式的字符串 console.log(now.toISOString()); // 输出UTC的ISO格式字符串
2. 解析已知格式的本地化日期字符串
如果你已经有一个本地化格式的日期字符串(比如你例子里的'5/19/2020, 12:43:27 PM'),最可靠的方式是手动解析字符串的各个部分,然后用Date的构造函数传入明确的年、月、日、时、分、秒参数(注意月份是从0开始计数的,1月对应0,12月对应11)。
举个针对你例子格式的解析函数:
function parseLocalDateString(localStr) { // 拆分日期和时间部分 const [datePart, timePart] = localStr.split(', '); // 解析日期:MM/DD/YYYY const [month, day, year] = datePart.split('/').map(Number); // 解析时间:HH:mm:SS AM/PM const [timeStr, period] = timePart.split(' '); let [hours, minutes, seconds] = timeStr.split(':').map(Number); // 处理12小时制转24小时制 if (period === 'PM' && hours !== 12) { hours += 12; } else if (period === 'AM' && hours === 12) { hours = 0; } // 创建Date对象,注意月份要减1 return new Date(year, month - 1, day, hours, minutes, seconds); } // 测试 const localDateStr = '5/19/2020, 12:43:27 PM'; const dateObj = parseLocalDateString(localDateStr); console.log(dateObj.toISOString()); // 应该输出2020-05-19T09:43:27.000Z(和你例子里的UTC时间对应)
为什么不推荐用Date构造函数解析本地化字符串?
因为toLocaleString()的输出没有统一标准:比如在中文环境下可能输出'2020/5/19 下午12:43:27',在欧洲部分地区可能是'19/05/2020 12:43:27',不同环境下Date构造函数对这些字符串的解析结果可能完全不同,甚至直接返回Invalid Date。
只有ISO 8601格式的字符串(比如'2020-05-19T12:43:27')才是Date构造函数能可靠解析的标准格式。
内容的提问来源于stack exchange,提问作者Systems Rebooter

