代码之家  ›  专栏  ›  技术社区  ›  El Dude

JS/TS日期对象构造函数

  •  0
  • El Dude  · 技术社区  · 7 年前

    我在日期对象的模糊性下痛苦:本地时间与UTC。

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

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

    这将在创建用户输入的新日期 UTC d1.toISOString() 它返回的是 UTC ,而不是本地用户时区。

    d1.getHours() 例如,将在当地时间,但与 d1.getTimezoneOffset() 添加到值中。所以

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

    如何解决这个问题?

    我看到了以下文档

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

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

    我的问题:

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   RobG    7 年前

    鉴于:

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

    然后:

    d1.getHours() != h
    

    仅在以下情况之一为真的情况下:

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

    以下内容显示,如果这些都不正确,则 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来获取本地时间戳?

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

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

    这个 toISOString

    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的解析器应允许使用。

    推荐文章