TypeScript无依赖转换dd.mm.yyyy格式日期字符串至Date类型遇NaN问题
解决自定义日期格式转Date的NaN问题
原生Date构造函数仅能可靠解析标准格式(如ISO 8601),像你遇到的德语/丹麦语格式(dd.MM.yyyy, HH:mm或dd.MM.yyyy HH:mm)属于自定义格式,直接解析会返回Invalid Date(表现为NaN)。不用第三方包的话,手动提取日期时间分量是最稳妥的方案:
实现步骤
- 统一字符串格式:先把带逗号的德语格式字符串中的逗号去掉,变成和丹麦语一致的空格分隔格式。
- 拆分日期与时间:按空格分割字符串,分离出日期段和时间段。
- 提取各时间分量:日期段按
.拆分得到日、月、年;时间段按:拆分得到时、分。注意:Date的月份是0-11,所以要把提取到的月份减1。 - 构建Date对象:用提取到的分量直接创建
Date实例,若需要UTC时间则用Date.UTC方法。
TypeScript代码实现
// 解析自定义格式的日期字符串为本地时间Date对象 function parseLocalDate(dateStr: string): Date { // 统一格式:去掉逗号(兼容德语格式) const normalizedStr = dateStr.replace(',', '').trim(); // 拆分日期和时间部分 const [datePart, timePart] = normalizedStr.split(' '); // 提取日、月、年并转为数字 const [day, month, year] = datePart.split('.').map(Number); // 提取时、分并转为数字 const [hour, minute] = timePart.split(':').map(Number); // 月份减1,因为Date的月份是0索引(0=1月,11=12月) return new Date(year, month - 1, day, hour, minute); } // 解析自定义格式的日期字符串为UTC时间Date对象 function parseUtcDate(dateStr: string): Date { const normalizedStr = dateStr.replace(',', '').trim(); const [datePart, timePart] = normalizedStr.split(' '); const [day, month, year] = datePart.split('.').map(Number); const [hour, minute] = timePart.split(':').map(Number); // 使用Date.UTC生成UTC时间戳,再转为Date对象 return new Date(Date.UTC(year, month - 1, day, hour, minute)); } // 测试示例 const germanDate = "22.02.2022, 15:56"; const danishDate = "22.02.2022 15:56"; console.log(parseLocalDate(germanDate)); // 输出对应本地时间的Date对象 console.log(parseUtcDate(danishDate)); // 输出对应UTC时间的Date对象
针对你现有代码的调整
你的getUtcDate函数是基于已有Date对象转UTC格式,若要从自定义字符串开始处理,可以结合上面的解析函数改造:
private getUtcDateFromCustomStr(dateStr: string): Date { const parsedLocalDate = parseLocalDate(dateStr); // 将本地时间转为UTC时间对象 return new Date(Date.UTC( parsedLocalDate.getFullYear(), parsedLocalDate.getMonth(), parsedLocalDate.getDate(), parsedLocalDate.getHours(), parsedLocalDate.getMinutes() )); }
这种手动解析的方式完全依赖原生API,不需要任何第三方包,且能确保对目标格式的解析准确性。
内容的提问来源于stack exchange,提问作者Manoj Prasanna
相关产品推荐
相关产品推荐

