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

在JS中将12小时制日期字符串转换为24小时制法语格式

修复日期转换问题并实现法语本地化24小时制格式

你的代码目前存在几个关键问题,导致无法正确完成日期转换,我来一步步帮你梳理解决:

原代码的核心问题

  • 语法错误:var formatItems = enter code here normalizedFormat.split('-');这行里的enter code here是未清理的占位符,直接导致代码运行报错,必须删除这个无效内容。
  • 月份逻辑错误:当没有指定月份时,你写的today.getMonth() - 1完全错误——getMonth()本身返回的就是0到11的数值(对应1月到12月),减1会让月份变成-1,完全不符合预期。
  • 自定义解析的脆弱性:手动解析日期字符串很容易因为格式细节(比如分隔符、AM/PM位置)出错,其实原生Date对象已经能处理你输入的"3/25/2018 11:51:46 PM"这种格式,没必要自己造轮子。

最优解决方案:用原生API实现需求

我们可以直接利用原生Date解析输入字符串,再通过toLocaleString()配合参数生成法语本地化的24小时制格式,简洁又可靠:

// 输入日期字符串
const inputDateStr = "3/25/2018 11:51:46 PM";

// 原生Date直接解析MM/DD/YYYY hh:mm:ss AM/PM格式
const dateObj = new Date(inputDateStr);

// 生成法语本地化的24小时制格式(默认输出类似 "25/03/2018 à 23:51:46")
const frenchFormattedDate = dateObj.toLocaleString('fr-FR', {
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
  hour12: false // 强制启用24小时制
});

console.log(frenchFormattedDate); // 输出:25/03/2018 à 23:51:46

如果你的需求是要类似"10/05/2018 at 08:51:46"这种用"at"替代法语"à"的格式,可以手动调整:

const [datePart, timePart] = dateObj.toLocaleString('fr-FR', {
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
  hour12: false
}).split(' à ');

const customFormattedDate = `${datePart} at ${timePart}`;
console.log(customFormattedDate); // 输出:25/03/2018 at 23:51:46

若坚持使用自定义解析函数(修复版)

如果因为特殊场景必须保留自己的解析逻辑,这里是修复后的完整代码:

String.prototype.toDate = function(format) {
  var normalized = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat = format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  // 修复语法错误:删除占位符,正确拆分格式项
  var formatItems = normalizedFormat.split('-');
  var dateItems = normalized.split('-');
  
  var monthIndex = formatItems.indexOf("mm");
  var dayIndex = formatItems.indexOf("dd");
  var yearIndex = formatItems.indexOf("yyyy");
  var hourIndex = formatItems.indexOf("hh");
  var minutesIndex = formatItems.indexOf("ii");
  var secondsIndex = formatItems.indexOf("ss");
  
  var today = new Date();
  var year = yearIndex > -1 ? dateItems[yearIndex] : today.getFullYear();
  // 修复月份默认值:不需要额外减1
  var month = monthIndex > -1 ? dateItems[monthIndex] - 1 : today.getMonth();
  var day = dayIndex > -1 ? dateItems[dayIndex] : today.getDate();
  var hour = hourIndex > -1 ? dateItems[hourIndex] : today.getHours();
  var minute = minutesIndex > -1 ? dateItems[minutesIndex] : today.getMinutes();
  var second = secondsIndex > -1 ? dateItems[secondsIndex] : today.getSeconds();
  
  // 优化AM/PM判断:先检查字符串是否包含时段标识
  const hasAmPm = this.includes('AM') || this.includes('PM');
  if (hasAmPm) {
    const period = this.split(" ")[2];
    if (period == "PM" && hour < 12) {
      hour = hour + 12;
    } else if (period == "AM" && hour == 12) {
      hour = hour - 12;
    }
  }
  
  console.log(year + " " + month + " " + day + " " + hour + " " + minute + " " + second);
  return new Date(year, month, day, hour, minute, second);
};

const logd = "3/25/2018 11:51:46 PM".toDate("mm/dd/yyyy hh:ii:ss");
// 输出法语24小时制格式
console.log(logd.toLocaleString('fr-FR', { hour12: false }));

这个版本解决了原代码的语法错误和逻辑问题,能正确解析日期并输出符合要求的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:40:58