在JS中将12小时制日期字符串转换为24小时制法语格式
修复日期转换问题并实现法语本地化24小时制格式
你的代码目前存在几个关键问题,导致无法正确完成日期转换,我来一步步帮你梳理解决:
原代码的核心问题
- 语法错误:
var formatItems =enter code herenormalizedFormat.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
相关产品推荐
相关产品推荐

