简体   繁体   English

添加或减去 javascript 日期的时区差异

[英]add or subtract timezone difference to javascript Date

What is the best approach to add or subtract timezone differences to the targetTime variable below.在下面的targetTime变量中添加或减去时区差异的最佳方法是什么。 The GMT timezone values comes from the DB in this format: 1.00 for London time, -8.00 for Pacific time and so on. GMT 时区值以这种格式来自数据库:伦敦时间为1.00 ,太平洋时间为-8.00 ,依此类推。

Code looks like this:代码如下所示:

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

You can use Date.getTimezoneOffset which returns the local offset from GMT in minutes.您可以使用 Date.getTimezoneOffset 以分钟为单位返回 GMT 的本地偏移量。 Note that it returns the value with the opposite sign you might expect.请注意,它返回的值与您可能期望的符号相反。 So GMT-5 is 300 and GMT+1 is -60.所以 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);

Simple function that works for me:对我有用的简单功能:

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

If you need to compensate the timezone I would recommend the following snippet:如果您需要补偿时区,我会推荐以下代码段:

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

This example shows how to use the local datetime but format it as ISO:此示例显示如何使用本地日期时间但将其格式化为 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());

Typescript version of @alexp answer @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;
      } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM