特定时区的日期数学

问题描述 投票:0回答:2

我想找到太平洋时间特定日期的特定时间(假设上午 9:30)的时间偏移,而我的程序可能正在其他一些区域设置中运行。这行不通:

const targetdate = '12/13/2025';
const target = new Date(targetdate);
target.setHours(9, 30);  // won't work, uses local time zone
const timeDelta = target - new Date();

因为

setHours
使用当地时区而不是太平洋时区。

以下方法半年也不起作用:

const PST_offset = 7;  // won't work if target date is DST
target.setUTCHours(9 + PST_offset, 30);  

因为夏令时期间与 UTC 的偏移量不同。

有什么方法可以告诉 Node 使用 Pacific 作为其语言环境吗?我也知道

Intl.DateTimeFormat
,但这与显示日期和时间有关,而不是
Date
数学。

仅从 UTC 偏移到太平洋时间并非易事,因为相关日期可能采用太平洋夏令时 (UTC-7) 或太平洋标准时间 (UTC-8),具体取决于相关

targetdate
。我想我可以计算出日期属于哪一个,如果规则不是太神秘的话,但这是否已经以某种更优雅的方式解决了?

javascript node.js datetime timezone
2个回答
0
投票

事实证明,你可以告诉 Node 你的语言环境是一个特定的时区,如下所示:

process.env.TZ = 'America/Los_Angeles';

所以上面的代码片段就变成了这样,它按预期工作:

process.env.TZ = 'America/Los_Angeles';
const targetdate = '12/13/2025';
const target = new Date(targetdate);
target.setHours(9, 30);  // 9:30am PDT or PST as appropriate
const timeDelta = target - new Date();

-1
投票

您可以使用

toLocalString
Etc/GMT+8
来固定时区而不保存时间,然后设置小时和分钟:


// this gives you a timestamp for the given date at midnight in GMT+8
const pstDate = new Date(
  new Date(new Date('12/13/2025').toLocaleString('en-US', { timeZone: 'Etc/GMT+8' }))
);

// now add 9:30 on top of that if you want that time in GMT+8
pstDate.setHours(
  new Date('12/13/2025').getHours() + 9,
  new Date('12/13/2025').getMinutes() + 30
);

console.log(pstDate - new Date());
© www.soinside.com 2019 - 2024. All rights reserved.