【问题标题】:add or subtract timezone difference to javascript Date向javascript日期添加或减去时区差异
【发布时间】:2011-09-13 14:25:22
【问题描述】:

在下面的targetTime 变量中添加或减去时区差异的最佳方法是什么。 GMT 时区值来自数据库,格式如下:1.00 表示伦敦时间,-8.00 表示太平洋时间等等。

代码如下:

date = "September 21, 2011 00:00:00";
targetTime = new Date(date);

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    您可以使用 Date.getTimezoneOffset 以分钟为单位返回与 GMT 的本地偏移量。请注意,它返回的值与您可能期望的符号相反。所以 GMT-5 是 300,而 GMT+1 是 -60。

    var date = "September 21, 2011 00:00:00";
    var targetTime = new Date(date);
    var timeZoneFromDB = -7.00; //time zone value from database
    //get the timezone offset from local time in minutes
    var tzDifference = timeZoneFromDB * 60 + targetTime.getTimezoneOffset();
    //convert the offset to milliseconds, add to targetTime, and make a new Date
    var offsetTime = new Date(targetTime.getTime() + tzDifference * 60 * 1000);
    

    【讨论】:

    • 这是正确的,但是如果您所在国家/地区是夏令时,现在如果您的 GMT 是 +2,那么现在应该是 +1
    • getTimezoneOffset 考虑夏令时。我在美国东部时区,通常是 GMT-5,但夏令时是 GMT-4。如果我现在在浏览器中调用 getTimezoneOffset,我会得到 240,即 GMT-4。当然,这仅处理当地时间的夏令时。应在后端针对 DST 调整与 DB 的时区偏移量。
    【解决方案2】:

    对我有用的简单功能:

    adjustForTimezone(date:Date):Date{
        var timeOffsetInMS:number = date.getTimezoneOffset() * 60000;
        date.setTime(date.getTime() + timeOffsetInMS);
        return date
    }
    

    【讨论】:

    • 它对我有用。但第三行的小改动date.setTime(date.getTime() + timeOffsetInMS); 添加+ 而不是-
    【解决方案3】:

    如果您需要补偿时区,我会推荐以下 sn-p:

    var dt = new Date('2018-07-05')
    dt.setMinutes(dt.getMinutes() + dt.getTimezoneOffset())
    console.log(dt)
    

    【讨论】:

    • 很棒的解决方案 Brazuca! :D
    • 我需要将其恢复为日期,因此将第 2 行包装在新日期中,即new Date(dt.setMinutes(dt.getMinutes() + dt.getTimezoneOffset()))
    • 虽然对我来说加号必须是减号。大脑不太清楚到底是为什么。
    【解决方案4】:

    这个例子展示了如何使用本地日期时间,但将其格式化为 ISO:

    const d = new Date();
    
    let dtOffset = new Date(d.setMinutes(d.getMinutes() - d.getTimezoneOffset()));
    // Date in EST and ISO format: "2021-11-30T15:33:32.222Z"
    console.log(dtOffset.toISOString());
    

    【讨论】:

      【解决方案5】:

      @alexp 答案的打字稿版本

           adjustForTimezone(d:Date, offset:number):Date{
              var date = d.toISOString();
              var targetTime = new Date(date);
              var timeZoneFromDB = offset; //time zone value from database
              //get the timezone offset from local time in minutes
              var tzDifference = timeZoneFromDB * 60 + targetTime.getTimezoneOffset();
              //convert the offset to milliseconds, add to targetTime, and make a new Date
              var offsetTime = new Date(targetTime.getTime() + tzDifference * 60 * 1000);
              return offsetTime;
            } 
      

      【讨论】:

        猜你喜欢
        • 2015-05-26
        • 2015-11-11
        • 2022-01-23
        • 1970-01-01
        • 2020-12-13
        • 2020-12-14
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多