JS如何将Jun 02,2022 CDT日期格式转换为06/02/2022 时分格式
日期格式转换实现方案
需求是将Jun 02, 2022 at 05:55 AM CDT格式的日期,转换为06/02/2022 at 05:55 AM格式,原有默认配置的Intl.DateTimeFormat无法满足输出要求,原有代码如下:
order.messageSentOn = new Intl.DateTimeFormat('en-US').format(dbDate);
问题原因
默认实例化的Intl.DateTimeFormat仅会输出en-US区域的默认短日期格式,不会携带时间片段,也无法自定义拼接出需要的「月/日/年 at 时分 上下午」结构。
可直接使用的实现
方案1:基于Intl.DateTimeFormat自定义配置
通过给格式化方法传入明确的规则参数,搭配formatToParts提取各片段后按需求拼接即可,该方案兼容性好,不需要手动处理补0、上下午判断逻辑:
// 原始日期转Date对象,原生Date可直接识别CDT时区格式 const dbDate = new Date("Jun 02, 2022 at 05:55 AM CDT"); const formatter = new Intl.DateTimeFormat('en-US', { month: '2-digit', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', hour12: true, // 如果需要固定保留CDT(美国中部时区)时间,避免跨环境时区偏移,加上下面这行 // timeZone: 'America/Chicago' }); const parts = Object.fromEntries( formatter.formatToParts(dbDate).map(item => [item.type, item.value]) ); order.messageSentOn = `${parts.month}/${parts.day}/${parts.year} at ${parts.hour}:${parts.minute} ${parts.dayPeriod}`;
运行后输出结果完全匹配目标格式:06/02/2022 at 05:55 AM。
方案2:手动提取日期字段拼接
逻辑更直观,不依赖Intl配置,适合需要完全自主控制拼接逻辑的场景:
const dbDate = new Date("Jun 02, 2022 at 05:55 AM CDT"); // 数字补0工具 const pad2 = n => String(n).padStart(2, '0'); const month = pad2(dbDate.getMonth() + 1); // Date月份从0开始计数,需要+1 const day = pad2(dbDate.getDate()); const year = dbDate.getFullYear(); const rawHour = dbDate.getHours(); const period = rawHour >= 12 ? 'PM' : 'AM'; const hour = pad2(rawHour % 12 || 12); // 0点转换为12 const minute = pad2(dbDate.getMinutes()); order.messageSentOn = `${month}/${day}/${year} at ${hour}:${minute} ${period}`;
内容的提问来源于stack exchange,提问作者Rakhi
相关产品推荐
相关产品推荐

