You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现客户端土耳其格式日期转换?JS日期函数报错排查

解决土耳其语日期格式转换问题:从NaN-undefined-NaN到正确格式

你遇到的输出异常问题,核心原因其实很明确,我来帮你拆解和修复:

问题根源分析

出现NaN-undefined-NaN是因为:

  • 你从DOM中拿到的毫秒数是字符串格式,直接传给new Date()时,它会尝试把字符串解析为日期字符串而非毫秒数,导致创建了无效的Date对象,getDate()getMonth()这些方法自然返回NaN,月份数组取值也就变成了undefined。
  • 另外你还没处理日期的两位数格式要求,比如1号需要显示为01

修正后的代码方案

const dSelector = document.querySelectorAll(".date");
const formatDate = (de) => {
  // 把字符串毫秒数转为数字,让new Date能正确识别
  const timestamp = Number(de);
  const monthNames = [
    "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran",
    "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
  ];
  const date = new Date(timestamp);
  // 补零处理,确保日期是两位数
  const day = date.getDate().toString().padStart(2, '0');
  const monthIndex = date.getMonth();
  const year = date.getFullYear();
  return `${day}-${monthNames[monthIndex]}-${year}`;
}
dSelector.forEach((d) => {
  d.innerHTML = formatDate(d.innerHTML);
});

关键改动说明

  1. 毫秒数类型转换:用Number(de)把DOM中获取的字符串毫秒数转成数字,这样new Date(timestamp)才能正确生成有效的日期对象。
  2. 日期补零:通过padStart(2, '0')方法,自动给个位数日期补前导零,满足你需要的两位数日期格式。

更简洁的替代方案(利用原生API)

其实你提到的toLocaleDateString("tr-TR")也能实现需求,只要配置对应选项再调整分隔符就行,不用手动维护月份数组:

const dSelector = document.querySelectorAll(".date");
const formatDate = (de) => {
  const timestamp = Number(de);
  // 用原生API直接生成土耳其语格式,再替换分隔符
  return new Date(timestamp).toLocaleDateString('tr-TR', {
    day: '2-digit',
    month: 'long',
    year: 'numeric'
  }).replace(/\//g, '-');
}
dSelector.forEach((d) => {
  d.innerHTML = formatDate(d.innerHTML);
});

内容的提问来源于stack exchange,提问作者user11075555

火山引擎 最新活动