You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:51:15