如何使用JavaScript获取下一个PST中午12点对应的epoch时间戳?
JavaScript获取下一个PST中午12点epoch时间戳实现方案
首先明确PST为太平洋标准时间,固定对应UTC-8,如果你需要的是跟随太平洋地区时令自动切换PST/PDT的中午12点,可以选择第二种适配夏令时的方案。
方案1:固定PST(UTC-8,不考虑夏令时)
适合业务规则明确要求全年统一使用UTC-8时间计算的场景,无需处理时区偏移变动:
function getNextPSTNoonTimestamp() { // PST固定偏移:UTC-8,单位毫秒 const PST_OFFSET = -8 * 3600 * 1000; const now = new Date(); // 计算当前PST时间 const pstNow = new Date(now.getTime() + PST_OFFSET); // 构造当日PST中午12点 const pstNoon = new Date(pstNow.getFullYear(), pstNow.getMonth(), pstNow.getDate(), 12, 0, 0, 0); // 若当前PST时间已过当日12点,顺延1天 if (pstNow > pstNoon) { pstNoon.setDate(pstNoon.getDate() + 1); } // 转换为UTC时间戳(毫秒级) const timestamp = pstNoon.getTime() - PST_OFFSET; // 如需秒级时间戳,返回 Math.floor(timestamp / 1000) return timestamp; } // 调用示例 console.log(getNextPSTNoonTimestamp());
方案2:适配太平洋时区夏令时(自动切换PST/PDT)
适合面向太平洋地区用户、需要遵循当地实际时间规则的场景,自动适配夏令时PDT(UTC-7):
function getNextPacificNoonTimestamp() { const now = new Date(); // 太平洋时区标识符,自动处理时令切换 const TIME_ZONE = 'America/Los_Angeles'; // 提取当前太平洋时间的年、月、日、时 const formatter = new Intl.DateTimeFormat('en-US', { timeZone: TIME_ZONE, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', hour12: false }); const parts = formatter.formatToParts(now); const year = parseInt(parts.find(item => item.type === 'year').value); const month = parseInt(parts.find(item => item.type === 'month').value) - 1; const day = parseInt(parts.find(item => item.type === 'day').value); const currentHour = parseInt(parts.find(item => item.type === 'hour').value); // 构造当日太平洋时间12点 let nextNoon = new Date(year, month, day, 12, 0, 0, 0); // 计算时区偏移得到正确UTC时间 const offsetMatch = nextNoon.toLocaleString('en-US', { timeZone: TIME_ZONE, timeZoneName: 'longOffset' }).match(/GMT([+-]\d+):(\d+)/); const offsetMs = (parseInt(offsetMatch[1]) * 60 + parseInt(offsetMatch[2])) * 3600 * 1000; nextNoon = new Date(nextNoon.getTime() - offsetMs); // 若已过当日12点,顺延1天 if (currentHour >= 12) { nextNoon.setDate(nextNoon.getDate() + 1); } const timestamp = nextNoon.getTime(); // 如需秒级时间戳,返回 Math.floor(timestamp / 1000) return timestamp; } // 调用示例 console.log(getNextPacificNoonTimestamp());
注意事项
- 两种方案默认返回毫秒级epoch时间戳,需要秒级的话对结果除以1000取整即可
- 方案2的时区API兼容所有现代浏览器和Node.js v14+版本,无需引入第三方依赖
内容的提问来源于stack exchange,提问作者Huy Vo
相关产品推荐
相关产品推荐

