我受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,请使用带有相同参数的新Date(Date.UTC(...))。
但是我无法确定如何正确使用本地时间和UTC时间...
我的问题:
如何正确使用Date
处理用户输入以及如何调用toISOString
获取本地时间戳?我需要用户以ISO格式指定的本地日期字符串。不是语言环境,而是数字。我不在乎语言环境的输出。
答案 0 :(得分:1)
给出:
const d1 = new Date(y, mo -1, d, h, m)
然后:
d1.getHours() != h
仅在满足以下条件之一的情况下:
以下显示了当所有这些都不成立时,则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);
如何正确使用Date处理用户输入以及如何调用toISOString获取本地时间戳?
在使用多个参数调用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的解析器所允许。