JavaScript如何不受时区影响获取Unix时间戳对应周UTC周一零点时间戳
需求描述
传入形如1655402413的Unix时间戳,需要不受运行环境当日日期、用户时区配置影响,定位到该时间戳所属周的UTC/GMT时区周一零点时间,最终返回该周一时间对应的Unix时间戳。
原有实现代码如下:
function findMonday(unixTimeStamp) { let startDate = new Date(unixTimeStamp); let startDay = startDate.getDay(); let diff = startDate.getDate() - startDay + (startDay === 0 ? -6 : 1); let monday = new Date(startDate.setDate(diff)); monday.setHours(0, 0, 0, 0); monday = new Date(monday).valueOf(); return monday; }
原有代码存在两个和Date对象默认使用用户当前时区有关的问题:
- 若传入的时间戳刚好对应UTC/GMT时区的周一零点,受用户所在时区偏移影响,
startDate会被解析为本地时间的周日,函数会错误返回上一周的周一时间戳,不符合需求 - 返回的
monday结果是基于本地时间计算的零点,不是要求的UTC/GMT时区零点结果。
实现方案
所有日期计算逻辑统一使用Date对象的UTC系列API,完全绕开本地时区的解析、计算逻辑,从根源避免时区影响:
function findUTCMonday(unixTimeStamp) { const MILLISECONDS_PER_DAY = 86400 * 1000; const targetDate = new Date(unixTimeStamp); // 获取UTC时区下的星期值,规则:0=周日,1=周一,2=周二...6=周六 const utcDayOfWeek = targetDate.getUTCDay(); // 计算当前UTC日期到当周周一的天数差 const dayDiff = utcDayOfWeek === 0 ? 6 : utcDayOfWeek - 1; // 先将当前UTC时间设为当日零点,再减去对应天数差,得到周一零点时间戳 targetDate.setUTCHours(0, 0, 0, 0); return targetDate.getTime() - dayDiff * MILLISECONDS_PER_DAY; }
验证逻辑:传入UTC周一零点时间戳
1655366400(对应2022-06-16 00:00:00 UTC),无论运行环境配置的是哪个时区,函数都会稳定返回1655366400,不会出现偏移到上一周的问题;所有计算步骤不依赖本地时区参数,跨环境运行结果一致。
内容的提问来源于stack exchange,提问作者squidslippers
相关产品推荐
相关产品推荐

