我有一个特定时区的日期时间作为字符串,我想将其转换为本地时间。但是,我不知道如何在Date对象中设置时区。

例如,我有2013年2月28日东部时间晚上7点,然后我可以

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);  

据我所知,我可以设置UTC时间或本地时间。但是,如何在另一个时区设置时间呢?

我尝试使用添加/减去UTC的偏移量,但我不知道如何对抗夏令时。我不确定我走的方向是否正确。

如何在javascript中将时间从不同的时区转换为本地时间?


当前回答

这应该解决您的问题,请随时提供修复。该方法还将考虑给定日期的夏时制。

dateWithTimeZone = (timeZone, year, month, day, hour, minute, second) => {
  let date = new Date(Date.UTC(year, month, day, hour, minute, second));

  let utcDate = new Date(date.toLocaleString('en-US', { timeZone: "UTC" }));
  let tzDate = new Date(date.toLocaleString('en-US', { timeZone: timeZone }));
  let offset = utcDate.getTime() - tzDate.getTime();

  date.setTime( date.getTime() + offset );

  return date;
};

如何与时区和本地时间一起使用:

dateWithTimeZone("America/Los_Angeles",2019,8,8,0,0,0)

其他回答

我也有同样的问题,但是我们可以使用我们想要的时区 我们使用。tolocaledatestring ()

例如: var day=new Date(); const选项={日:“数字”,月:“长”,年:“数字”,时区:“亚洲/加尔各答”}; const今天=。toLocaleDateString(“en-IN”,选项); console.log(今天);

正如马特·约翰逊所说

如果你可以限制你的使用现代网络浏览器,你现在可以做到 以下没有任何特殊库: 新的日期()。toLocaleString("en-US", {timeZone: "America/New_York"})

这不是一个全面的解决方案,但它适用于许多场景 只需要输出转换(从UTC或本地时间到) 具体时区,但没有其他方向)。

所以尽管浏览器在创建日期时不能读取IANA时区,或者有任何方法来更改现有date对象上的时区,但似乎有一个hack围绕它:

function changeTimezone(date, ianatz) { // suppose the date is 12:00 UTC var invdate = new Date(date.toLocaleString('en-US', { timeZone: ianatz })); // then invdate will be 07:00 in Toronto // and the diff is 5 hours var diff = date.getTime() - invdate.getTime(); // so 12:00 in Toronto is 17:00 UTC return new Date(date.getTime() - diff); // needs to substract } // E.g. var here = new Date(); var there = changeTimezone(here, "America/Toronto"); console.log(`Here: ${here.toString()}\nToronto: ${there.toString()}`);

我知道这3年太晚了,但也许它可以帮助其他人,因为除了moment-timezone库之外,我还没有找到任何类似的东西,这与他在这里要求的不完全相同。

我为德国时区做了类似的事情, 这有点复杂,因为日光节约时间和闰年,你有366天。

它可能需要与“isDaylightSavingTimeInGermany”函数做一些工作,而不同的时区在不同的日光节约时间发生变化。

不管怎样,看看这个页面: https://github.com/zerkotin/german-timezone-converter/wiki

主要方法有: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone

我已经努力记录了它,所以它不会那么令人困惑。

对于Ionic用户来说,我遇到了麻烦,因为. toisostring()必须与html模板一起使用。

这将获取当前日期,但当然也可以添加到先前选定日期的答案中。

我用这个解决了它:

date = new date (); public currentDate: any = new Date(this.date.getTime() - this.date.getTimezoneOffset()*60000).toISOString();

*60000表示UTC -6,即CST,因此无论需要什么时区,数字和差异都可以更改。

这应该解决您的问题,请随时提供修复。该方法还将考虑给定日期的夏时制。

dateWithTimeZone = (timeZone, year, month, day, hour, minute, second) => {
  let date = new Date(Date.UTC(year, month, day, hour, minute, second));

  let utcDate = new Date(date.toLocaleString('en-US', { timeZone: "UTC" }));
  let tzDate = new Date(date.toLocaleString('en-US', { timeZone: timeZone }));
  let offset = utcDate.getTime() - tzDate.getTime();

  date.setTime( date.getTime() + offset );

  return date;
};

如何与时区和本地时间一起使用:

dateWithTimeZone("America/Los_Angeles",2019,8,8,0,0,0)