JS中如何获取以短横线“-”分隔的当前日期时间字符串?
问题根因
toLocaleDateString()、toLocaleTimeString()属于本地化接口,输出格式完全受运行环境的系统语言、区域配置、运行时版本影响,分隔符、字段顺序都没有统一标准,靠逐个替换特殊字符的方式做兼容非常容易漏匹配。你遇到的下划线未替换问题,本质是当前环境输出的时间字段分隔符没有被你写的替换规则覆盖,这种实现方式稳定性极差,不适合用来生成规范文件名。
最优实现方案
不要依赖本地化字符串接口,直接读取Date实例的年、月、日、时、分、秒字段手动拼接,格式完全可控,不会出现意外的非法字符:
const now = new Date(); // 数字补零,保证分、秒字段为两位数 const padZero = num => num.toString().padStart(2, '0'); // 拼接日期部分 const dateStr = `${now.getMonth() + 1}-${now.getDate()}-${now.getFullYear()}`; // 处理12小时制及时段 const period = now.getHours() >= 12 ? 'PM' : 'AM'; const hour12 = now.getHours() % 12 || 12; const timeStr = `${hour12}-${padZero(now.getMinutes())}-${padZero(now.getSeconds())}-${period}`; const dateTime = `${dateStr}-${timeStr}`; console.log(dateTime);
运行后输出格式完全匹配你的预期:6-24-2022-3-33-17-PM,且不受任何环境配置影响。
如果需要单行实现,可以用IIFE简写:
const dateTime = ((d,pad)=>`${d.getMonth()+1}-${d.getDate()}-${d.getFullYear()}-${d.getHours()%12||12}-${pad(d.getMinutes())}-${pad(d.getSeconds())}-${d.getHours()>=12?'PM':'AM'}`)(new Date(), n=>n.toString().padStart(2,'0'));
内容的提问来源于stack exchange,提问作者code-8
相关产品推荐
相关产品推荐

