我有一个特定时区的日期时间作为字符串,我想将其转换为本地时间。但是,我不知道如何在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中将时间从不同的时区转换为本地时间?
正如马特·约翰逊所说
如果你可以限制你的使用现代网络浏览器,你现在可以做到
以下没有任何特殊库:
新的日期()。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
我已经努力记录了它,所以它不会那么令人困惑。
试试这样的方法,
public static getTimezoneOffset(timeZone: string, date = new Date()): number {
const localDate = date.toLocaleString('fr', { timeZone, timeZoneName: 'long' });
const tz = localDate.split(' ');
const TZ = localDate.replace(tz[0], '').replace(tz[1], '').replace(' ', '');
const dateString = date.toString();
const offset = (Date.parse(`${dateString} UTC`) - Date.parse(`${dateString}${TZ}`)) / (3600 * 1000);
return offset;
}
感谢@commonpike的回答,我写了一个函数,它接受ISO字符串日期,如2020-10-10T08:00:00.000作为输入,并发送一个包含2个主要属性的对象。
第一个是fromUtc,它是一个Date,对应于作为参数输入的timeZone。
第二个是toUtc,它允许您格式化源自fromUtc的Date。
const timeZoneTransformer = (stringDate, timeZone = "Europe/Paris") => {
const now = new Date();
const serverDate = new Date(stringDate);
const utcDate = new Date(
Date.UTC(
serverDate.getFullYear(),
serverDate.getMonth(),
serverDate.getDate(),
serverDate.getHours(),
serverDate.getMinutes(),
serverDate.getSeconds()
)
);
const invdate = new Date(
serverDate.toLocaleString("en-US", {
timeZone,
})
);
const diff = now.getTime() - invdate.getTime();
const adjustedDate = new Date(now.getTime() - diff);
return {
toUtc: utcDate,
fromUtc: adjustedDate,
};
};
const fromUtc = timeZoneTransformer("2020-10-10T08:00:00.000").fromUtc;
console.log(fromUtc);
const toUtc = timeZoneTransformer(fromUtc).toUtc;
console.log(toUtc);
正如马特·约翰逊所说
如果你可以限制你的使用现代网络浏览器,你现在可以做到
以下没有任何特殊库:
新的日期()。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()}`);