如何在NestJS+TypeScript中解析匈牙利格式日期字符串?
解析匈牙利日期字符串的解决方案
JavaScript原生Date.parse()对非标准本地化日期格式支持有限,尤其是带匈牙利月份名称的字符串,所以需要针对性处理。以下是两种适用于NestJS/TypeScript的解决方案:
方案一:手动解析(无需额外依赖)
通过正则匹配两种格式,结合匈牙利月份映射表构造Date对象:
// 匈牙利月份名称到数字的映射(注意拼写和重音) const hungarianMonths: Record<string, number> = { január: 1, február: 2, március: 3, április: 4, május: 5, június: 6, július: 7, augusztus: 8, szeptember: 9, október: 10, november: 11, december: 12 }; export function parseHungarianDate(dateStr: string): Date | null { // 匹配带月份名称的格式:YYYY. MMMM DD. HH:mm const namedMonthPattern = /^(\d{4})\. (\w+) (\d{2})\. (\d{2}):(\d{2})$/; const namedMatch = dateStr.match(namedMonthPattern); if (namedMatch) { const [, year, monthName, day, hour, minute] = namedMatch; const monthNum = hungarianMonths[monthName.toLowerCase()]; if (!monthNum) return null; // Date构造函数的月份从0开始,所以要减1 return new Date( parseInt(year), monthNum - 1, parseInt(day), parseInt(hour), parseInt(minute) ); } // 匹配纯数字格式:YYYY.MM.DD. HH:mm const numericMonthPattern = /^(\d{4})\.(\d{2})\.(\d{2})\. (\d{2}):(\d{2})$/; const numericMatch = dateStr.match(numericMonthPattern); if (numericMatch) { const [, year, month, day, hour, minute] = numericMatch; return new Date( parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute) ); } return null; }
使用示例
const date1 = parseHungarianDate("2022. október 22. 12:00"); const date2 = parseHungarianDate("2022.11.01. 16:30"); console.log(date1); // 输出: Sat Oct 22 2022 12:00:00 GMT+... console.log(date2); // 输出: Tue Nov 01 2022 16:30:00 GMT+...
方案二:使用date-fns库(更简洁,支持更多场景)
date-fns提供了多语言日期解析能力,适合处理本地化格式:
- 安装依赖
npm install date-fns @date-fns/locale
- 实现解析函数
import { parse } from 'date-fns'; import { hu } from '@date-fns/locale'; export function parseHungarianDate(dateStr: string): Date | null { // 尝试解析带月份名称的格式 try { return parse(dateStr, 'yyyy. MMMM dd. HH:mm', new Date(), { locale: hu }); } catch {} // 尝试解析纯数字格式 try { return parse(dateStr, 'yyyy.MM.dd. HH:mm', new Date()); } catch {} return null; }
注意事项
- 手动解析时要确保月份名称的拼写完全匹配(包括重音符号),如果抓取的字符串有大小写差异,统一转成小写处理
- 使用date-fns时,确保
@date-fns/locale版本与date-fns版本兼容 - 可以将解析函数封装成NestJS自定义管道,在DTO中自动转换日期字符串
内容的提问来源于stack exchange,提问作者gdorina
相关产品推荐
相关产品推荐

