Javascript 时区格林威治标准时间和偏移量

Javascript timezone gmt and offset

关于 Javascript 日期 class,我已经阅读了很多关于 UTC/GMT 和时区的内容。但是有一点我不明白:

const date = new Date('August 19, 1975 23:15:30 GMT+04:00');
const offset = date.getTimezoneOffset()

我认为 'GMT+0400' 指出我当前的日期比 UTC 时间早 4 小时。所以 UTC 将是 'August 19, 1975 19:15:30'

为什么 'offset' 不是 -4? 'getTimezoneOffset' 是否使用了我浏览器的区域设置?如果是,我是否可以在特定时区创建日期?

I thought the 'GMT+0400' states that my current date is 4 houres before the UTC time.

GMT+0400 表示 字符串中的文本 以 GMT+0400 表示。但是 JavaScript Date 实例不允许您指定它们使用的时区。他们使用从 1970 年 1 月 1 日午夜 UTC 开始以毫秒为单位的偏移量,并提供函数来访问它们所代表的时间部分,以相对于代码为 运行 的系统时区的单位表示(getDategetHours 等)或相对于 UTC 的单位(getUTCDategetUTCHours)。 getTimezoneOffset 告诉你它们之间的区别。

因此,尽管您给出要解析的日期的文本以 GMT+0400 表示,但实例用于本地时间函数的时区始终是本地时区。

下面是这个事实的一个例子:两个字符串在不同的时区表示,但结果等同于 Date 个实例:

const s1 = "2020-08-31 12:30:00-0300";
const s2 = "2020-08-31 20:30:00+0500";
const d1 = new Date(s1);
const d2 = new Date(s2);
console.log(`s1 = ${s1}`);
console.log(`d1 = ${d1.toString()}`);
console.log(`s2 = ${s2}`);
console.log(`d2 = ${d2.toString()}`);
console.log(`d1 and d2 equivalent? ${d1.getTime() === d2.getTime()}`);

Is 'getTimezoneOffset' using the locale of my browser

是的。

...and if so, is there anyway that I can create a date in a specific timezone?

没有。但是新的 Temporal proposal 可能会让您拥有 Temporal.Absolute 个具有指定时区的实例。 (它仍处于早期阶段,所以情况可能会发生变化。)