You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:20:05