使用新的Date()。getTimezoneOffset()

时间:2018-11-14 12:29:09

标签: javascript angular typescript date

我有一个发送到服务器的日历数据,它包含此字段-

export interface CalendarDate{
    dayOfMonth: number;
    hourOfDay: number;
    minute: number;
    month: number;
    second: number;
    year: number;
}

我想参考时间偏移量计算将其转换为javascript日期,我在这件事上读了很多文章,这样做是正确的吗?在所有情况下都可以使用吗?

 return new Date(modificationDate.year, modificationDate.month, modificationDate.dayOfMonth,
                modificationDate.hourOfDay, modificationDate.minute -new Date().getTimezoneOffset(), modificationDate.second);

1 个答案:

答案 0 :(得分:1)

您似乎正在做的事情是将UTC值用作本地,因此您必须使用时区偏移量才能返回正确的时间。

否,由于您在获取函数运行时的时区偏移量(而不是解析日期)的偏移量,因此它并非在所有情况下均有效。在通过政府法规或法规或从夏令时更改时区偏移的地方,这可能会有所不同。例如。 Line Islands最近从-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,将日期的时间值设置为正确的值。显示日期时,将使用本地值,这些值将根据主机系统设置针对日期的时区偏移进行调整。您无需执行任何操作。