为 javascript Date 添加或减去时区差异

问题描述 投票:0回答:6

向下面的

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

代码如下所示:

date = "September 21, 2011 00:00:00";
targetTime = new Date(date);
javascript date
6个回答
97
投票

您可以使用 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);

36
投票

对我有用的简单功能:

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

20
投票

如果您需要补偿时区,我会推荐以下代码片段:

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset

getTimezoneOffset() 方法返回在 UTC 时区中计算的日期与在本地时区中计算的相同日期之间的差异(以分钟为单位)。

因此您需要的只是在几分钟内进行补偿


3
投票

此示例演示如何使用本地日期时间,但将其格式化为 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());

2
投票

@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;
      } 

0
投票
adjustForTimezone(date){    
      var targetTime = new Date(date);
      // Manually construct a UTC date string to ensure time components are set consistently
      // This avoids timezone and DST issues entirely
      return new Date(Date.UTC(targetTime.getFullYear(), targetTime.getMonth(), targetTime.getDate()));
}
© www.soinside.com 2019 - 2024. All rights reserved.