TypeScript日期格式化函数构建:字符串日期转可排序格式
解决TypeScript日期字符串转可排序格式的问题
你的需求是将08.04.2022 16.54这类日.月.年 时.分格式的字符串,转换成可用于表格排序的日期对象或数字格式。你的代码存在几个关键问题,下面逐一修正并说明:
原代码的问题点
- 未正确获取输入日期:函数内使用了未定义的
date变量,实际应从参数task的time属性取输入字符串 - Date构造函数的月份是0起始(0对应1月,11对应12月),直接传入拆分后的月份会导致日期偏移一个月
- 拆分得到的字符串未显式转为数字,虽然Date会隐式转换,但显式转换能避免潜在的类型问题
- 函数名
logName与功能不符,建议改为语义化名称 - 存在未使用的冗余变量
time = new Date();
修正后的代码
// 修正接口拼写(原Emply为拼写错误,可选保留原名称) export interface Employee { time: string; } // 解析任务时间为可排序的Date对象 function parseTaskTime(task: Employee): Date { // 匹配点号和空格作为分隔符,全局匹配确保拆分所有分隔位置 const SEPARATOR_REGEX = /[.\s]/g; // 从task.time中提取日期字符串并拆分 const [day, month, year, hour, minutes] = task.time.split(SEPARATOR_REGEX); // 月份减1适配Date的0起始规则,同时将所有字符串转为数字 return new Date( Number(year), Number(month) - 1, Number(day), Number(hour), Number(minutes) ); }
扩展:转成数字格式(时间戳)
如果需要直接返回可排序的数字,只需返回Date对象的毫秒级时间戳即可:
function parseTaskTimeToTimestamp(task: Employee): number { const SEPARATOR_REGEX = /[.\s]/g; const [day, month, year, hour, minutes] = task.time.split(SEPARATOR_REGEX); const date = new Date( Number(year), Number(month) - 1, Number(day), Number(hour), Number(minutes) ); // 返回毫秒级时间戳,可直接用于排序比较 return date.getTime(); }
使用说明
- 转换后的Date对象在数组排序时,会自动转为时间戳进行比较,直接使用
array.sort((a,b) => parseTaskTime(a) - parseTaskTime(b))即可实现按时间排序 - 时间戳本身是数字,排序逻辑更直接:
array.sort((a,b) => parseTaskTimeToTimestamp(a) - parseTaskTimeToTimestamp(b))
内容的提问来源于stack exchange,提问作者KrzysztofBojarczuk
相关产品推荐
相关产品推荐

