我有一个发送到服务器的日历数据,它包含以下字段-
export interface CalendarDate{
dayOfMonth: number;
hourOfDay: number;
minute: number;
month: number;
second: number;
year: number;
}
我想参考时间偏移计算将其转换为javascript Date,我在这方面阅读了很多帖子,这样做是否正确?它适用于所有情况吗?
return new Date(modificationDate.year, modificationDate.month, modificationDate.dayOfMonth,
modificationDate.hourOfDay, modificationDate.minute -new Date().getTimezoneOffset(), modificationDate.second);
您似乎正在做的是使用 UTC 值作为本地值,因此您必须使用时区偏移量才能回到正确的时间。
不,它不会在所有情况下都有效,因为您正在获取函数运行时的时区偏移量,而不是解析日期的时区偏移量。在时区偏移已通过政府法规或立法或夏令时更改的地方,这可能会有所不同。例如,莱恩群岛最近从 -12 变为 +14。
所以假设你得到的数据是 UTC,你可以使用 Date.UTC 来获取正确的日期和时间:
// data for 2018-01-01T12:00:00Z
var data = {
dayOfMonth: 1,
hourOfDay: 12,
minute: 0,
month: 0,
second: 0,
year: 2018
};
// Current function, uses current timezone offset regardless of date
function toDate(data) {
return new Date(
data.year, data.month, data.dayOfMonth, data.hourOfDay,
data.minute - new Date().getTimezoneOffset(), data.second);
}
// Better function, pure UTC
function toDateNew(data) {
return new Date(Date.UTC(
data.year, data.month, data.dayOfMonth, data.hourOfDay,
data.minute, data.second));
}
console.log('Existing: ' + toDate(data).toISOString() +
'\nor : ' + toDate(data).toString() +
'\nNew func: ' + toDateNew(data).toISOString() +
'\nor : ' + toDateNew(data).toString()
);
所以现在这些值被解析为 UTC,将日期的时间值设置为正确的值。当您显示日期时,将使用本地值,该值将根据主机系统设置调整日期的时区偏移。你不必做任何事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句