如何格式化生日日期?处理ISO 8601格式日期时少1天该如何解决
问题根源
你传入的日期是带Z后缀的UTC标准时间,Intl.DateTimeFormat()默认读取运行环境的本地时区进行日期格式化,如果你所在时区比UTC晚(比如中国处于UTC+8时区),2021-04-13T00:00:00.000Z对应的本地时间就是2021年4月12日16:00,最终格式化的结果就会显示为前一天。
解决方案
你可以根据需求选择以下修改方案:
- 方案1:强制格式化时使用UTC时区,和输入的日期时区保持一致
export function format(date): string { const mydate = new Date(date); // 传入timeZone参数指定为UTC return new Intl.DateTimeFormat(undefined, { timeZone: 'UTC' }).format(mydate); }
- 方案2:如果输入的日期本来就是对应本地时区的日期,传参时去掉末尾的
Z后缀,让Date对象按本地时区解析时间
比如将输入的2021-04-13T00:00:00.000Z改为2021-04-13T00:00:00.000再传入函数即可。 - 方案3:直接手动读取UTC时间的年月日拼接输出,完全规避时区影响
export function format(date): string { const mydate = new Date(date); const year = mydate.getUTCFullYear(); const month = String(mydate.getUTCMonth() + 1).padStart(2, '0'); const day = String(mydate.getUTCDate()).padStart(2, '0'); // 可按你需要的格式调整拼接规则,示例为yyyy-MM-dd格式 return `${year}-${month}-${day}`; }
内容的提问来源于stack exchange,提问作者Renan Fernandes
相关产品推荐
相关产品推荐

