JS / TS Date对象构造函数

时间:2018-12-13 06:05:11

标签: javascript typescript date datetime

我受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格式指定的本地日期字符串。不是语言环境,而是数字。我不在乎语言环境的输出。

1 个答案:

答案 0 :(得分:1)

给出:

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

然后:

d1.getHours() != h

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

  1. h 在该日期不存在(例如,处于从标准时间转换为夏令时的时间)
  2. h <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);

  

如何正确使用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的解析器所允许。