如何用toString格式化日期?四月、八月日期格式化异常求助
搞定日期转换里四月、八月的异常问题
嘿,我碰到过类似的坑!你这个问题的核心是原生JS的Date.parse()根本不支持解析带序数词(比如4th这种)的日期格式,这种非标准格式的解析行为完全没统一规范,不同月份(尤其是Apr、Aug)就容易出问题,其他月份只是碰巧能正常解析而已。
问题出在哪?
你写的Date.parse("Wednesday, 4th Apr 2018"),Date.parse()只认符合RFC 2822或者ISO 8601的标准日期字符串。带st/nd/rd/th的序数词日期属于“野路子”格式,浏览器和JS引擎对它的解析逻辑各不相同,这就导致四月(Apr)、八月(Aug)这类月份的解析直接翻车,其他月份只是运气好没踩坑。
怎么解决?
我们得先把日期里的序数词后缀去掉,转成标准格式再处理,分三步走:
- 把
4th改成4,去掉所有序数词后缀 - 用
Date构造函数解析处理后的标准字符串 - 手动格式化成
yyyy-MM-dd(嫌麻烦也可以用现成的日期库)
代码给你写好了!
纯JS手动实现(不用额外装库)
function formatCustomDate(dateStr) { // 把1st/2nd/3rd/4th这类序数词替换成纯数字 const cleanedDate = dateStr.replace(/(\d+)(st|nd|rd|th)/, '$1'); const date = new Date(cleanedDate); // 先检查日期是否有效 if (isNaN(date.getTime())) { throw new Error('这日期格式不对啊!'); } // 格式化为yyyy-MM-dd,注意月份是从0开始的,要+1,还要补零 const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // 测试你的例子 const Arrivaldte = formatCustomDate("Wednesday, 4th Apr 2018"); console.log(Arrivaldte); // 输出:2018-04-04
用Moment.js更省心(推荐)
如果项目里能装第三方库,Moment.js对这种非标准日期的支持超友好:
// 先确保项目里已经装了Moment.js const Arrivaldte = moment("Wednesday, 4th Apr 2018", "dddd, Do MMM YYYY").format("YYYY-MM-DD"); console.log(Arrivaldte); // 输出:2018-04-04
为啥偏偏四月、八月出问题?
说白了就是JS引擎对非标准日期的解析没谱,比如解析4th Apr时,有些引擎可能把Apr和th混在一起识别,或者对月份缩写的匹配逻辑抽风,而其他月份的缩写(比如Jan、Feb)不会和序数词后缀搞混,所以才没出问题。但这种碰运气的写法绝对不能留,必须先把日期转成标准格式再处理!
内容的提问来源于stack exchange,提问作者testingexpert
相关产品推荐
相关产品推荐

