開發中常遇到:給定「2016-12-31 23:50:50」加 2 小時應變為「2017-01-01 01:50:50」;減法同理。另須正確理解 UTC 偏移:UTC+3.5 代表 3 小時 30 分鐘,而非 3 小時 5 分鐘。
直接操作 d.getUTCHours() + 3 會導致小時超出 0-23 範圍,且不自動進位日期、月份、年份。
function addHours(dateStr, hours) {
const d = new Date(dateStr); // 自動解析本地時間或 ISO 字符串
d.setHours(d.getHours() + hours); // setHours 會自動處理日期、月份、年份進位
return d;
}
// 測試
console.log(addHours('2016-12-31 23:50:50', 2)); // 2017-01-01 01:50:50
console.log(addHours('2016-01-01 00:00:00', -2)); // 2015-12-31 22:00:00
獲取 UTC 時間後,用 setHours / setMinutes 進行偏移,再用 getFullYear() 等本地方法輸出:
function getTimeInZone(utcOffsetHours, utcOffsetMinutes = 0) {
const now = new Date();
const utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),
now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
const target = new Date(utc + (utcOffsetHours * 3600 + utcOffsetMinutes * 60) * 1000);
return target;
}
// UTC+8 (北京)
console.log(getTimeInZone(8));
// UTC+3.5 (德黑蘭)
console.log(getTimeInZone(3, 30));
2016-12-31T23:50:50Z)。moment-timezone 或 date-fns-tz 庫。