首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JavaScript 時間運算全攻略:跨日、跨月、跨年與時區處理

     編輯:程式設計疑難解答

核心問題

開發中常遇到:給定「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 範圍,且不自動進位日期、月份、年份。

正確方案:利用 Date 對象自動進位

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));

最佳實踐建議

  • 存儲/傳輸統一用 ISO 8601 字符串(如 2016-12-31T23:50:50Z)。
  • 業務邏輯盡量在 UTC 下計算,展示時再轉換目標時區。
  • 複雜場景引入 moment-timezone 或 date-fns-tz 庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved