gpt4 book ai didi

javascript - JS/TS Date 对象构造函数

转载 作者:行者123 更新时间:2023-12-03 00:33:26 25 4
gpt4 key购买 nike

我因 Date 对象的模糊性而感到痛苦:本地时间与 UTC。问题:

用户可以输入年、月、日、小时、分钟,然后将其用于 Date 对象:

const d1 = new Date(y, mo -1, d, h, m)

这会为 UTC 的用户输入创建一个新日期。每当我调用 d1.toISOString() 时,它都会返回 UTC 的 ISO 字符串,而不是本地用户时区。

此外,例如,d1.getHours() 将采用本地时间,但将 d1.getTimezoneOffset() 添加到值中。所以

d1.getHours() != h
d1.getHours() == h - d1.getTimezoneOffset()

如何解决这个问题?

我看到以下文档

注意:当 Date 作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要 UTC,请使用具有相同参数的 new Date(Date.UTC(...))。

但我无法理解如何正确使用本地和 UTC 时间...

我的问题:

我该如何正确使用Date来处理用户输入以及如何调用toISOString来获取本地时间戳?我需要用户指定的 ISO 格式的本地日期字符串。不是区域设置,只是数字。我不关心语言环境输出。

最佳答案

给定:

const d1 = new Date(y, mo -1, d, h, m)

然后:

d1.getHours() != h

仅在满足以下条件之一的情况下:

  1. 该日期不存在h(例如,正处于从标准时间到夏令时的过渡期间)
  2. 小时<0
  3. h > 23。

下面显示,当这些都不成立时,则 d.getHours() == h

let [Y, M, D, h, m, s] = [2018, 0, 1, 15, 30, 15]; // 2018-01-01T15:30:15
var d = new Date(Y, M, D, h, m, s);
console.log(d.getHours() == h);

How shall I properly use Date to handle user input and how call the toISOString to get local timestamps?

如果使用多个参数调用 Date 构造函数,则这些值将被视为本地值。要将它们视为 UTC,请使用 Date.UTC 方法:

`new Date(Date.UTC(Y, M, D, h, m, s)); 

toISOString 方法始终返回 UTC 时间戳。如果您想要带有本地时区偏移量的 ISO 8601 时间戳,您应该使用库或编写自己的函数,例如:

function toISOStringLocal(d) {
// Pad single digit numbers with leading zero
function z(n){return (n<10?'0':'') + n}
// Convert timezoneOffset to HH:mm
function formatOffset(offset) {
let sign = offset < 0? '+' : '-';
offset = Math.abs(offset);
return sign + z(offset/60|0) + ':' + z(offset%60);
}
return d.getFullYear() + '-' + z(d.getMonth()+1) + '-' +
z(d.getDate()) + 'T' + z(d.getHours()) + ':' +
z(d.getMinutes()) + ':' + z(d.getSeconds()) +
formatOffset(d.getTimezoneOffset());
}

console.log(toISOStringLocal(new Date()));

在偏移量中使用“:”需要与 ECMA-262 一致,并且符合 ISO 8601 的解析器应该能够容忍。

关于javascript - JS/TS Date 对象构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53755848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com