JavaScript如何将201708格式日期字符串转换为M yy格式
问题原因
直接调用new Date("201708")无法得到预期结果,是因为YYYYMM格式的6位无分隔数字串不属于ECMAScript标准规定的Date构造函数可可靠解析的日期格式,不同JS引擎对这类非标准字符串的解析逻辑不统一:多数引擎会将其识别为无效日期,或是直接按毫秒级时间戳解析,最终得到的时间和目标日期完全不符。
可靠实现方案
不要依赖Date构造函数的自动解析能力,手动拆分字符串提取年、月字段,是兼容性最好、不会出现解析偏差的方案,具体实现如下:
const rawDateStr = "201708"; // 拆分字段:前4位为年份,后2位为月份 const year = Number(rawDateStr.slice(0, 4)); // 注意:JS中Date的月份参数从0开始计数(0代表1月),所以提取到的月份要减1 const month = Number(rawDateStr.slice(4, 6)) - 1; // 构造Date对象时明确传入日参数为1,避免时区、月末日期导致的月份偏移问题 const targetDate = new Date(year, month, 1); // 格式化为M yy格式(M为不补零的数字月份,yy为两位年份) const formattedDate = `${targetDate.getMonth() + 1} ${String(targetDate.getFullYear()).slice(-2)}`; console.log(formattedDate); // 输出:8 17
如果不想手动拼接格式化结果,也可以用JS内置的国际化API实现格式化,逻辑更严谨:
const dateFormatter = new Intl.DateTimeFormat('en', { month: 'numeric', // 输出不补零的数字月份,匹配M规则 year: '2-digit' // 输出两位年份,匹配yy规则 }); const formattedDateByApi = dateFormatter.format(targetDate); console.log(formattedDateByApi); // 输出:8 17
注意事项
- 所有非标准格式的日期字符串,都不建议直接传入Date构造函数解析,手动拆分字段的方式可以100%避免跨浏览器、跨环境的解析差异
- 构造年月对应的Date对象时,必须手动传入日字段值为1,否则默认取当前日期,若当前日期是某月31日,遇到只有30天的月份或是2月时,会自动进位到下一月,导致结果错误
内容的提问来源于stack exchange,提问作者Heiko
相关产品推荐
相关产品推荐

