js處理時間時區問題


  問題背景:服務器時間是東八區時間,頁面會在全世界各地,頁面 JS 功能需要對比服務器時間和用戶本地時間,為兼容世界各地時間,需要將用戶本地時間轉換為東八區時間

一、基本概念

1、格林威治時間

  格林威治子午線上的地方時,或零時區(中時區)的區時叫做格林威治時間,也叫世界時。比如我們中國是東八區,北京時間是(GMT+08:00)

2、獲得本地與格林威治時間的時差:new Date().getTimezoneOffset(),單位為分鍾。

3、已知本地時間,換算對應格林威治時間:

  格林威治時間 = 本地時間 + 時差

4、已知本地時間,換算其他時區的時間

  其他時區時間 + 其他時區時差 = 本地時間 + 本地時差

  其他時區時間 = 本地時間 + 本地時差 - 其他時區時差

5、注意:new Date().getTimezoneOffset(),獲取的東時區為 負數,西時區為正數。我們也保持一致

// 目標時區,東9區
let targetTimezone = -9
// 當前時區與中時區時差,以min為維度
let _dif = new Date().getTimezoneOffset() // 本地時區時間 + 時差 = 中時區時間 // 目標時區時間 + 時差 = 中時區時間 // 目標時區時間 = 本地時區時間 + 本地時區時差 - 目標時區時差 // 東9區時間
let east9time = new Date().getTime() + _dif * 60 * 1000 - (targetTimezone * 60 * 60 * 1000) new Date(east9time)

二、還有一種問題場景就是:時間轉義漢字,比如剛剛、幾分鍾前等。如果服務器是存的東8區時間,那么在東9區的頁面剛剛的情況就會顯示1小時前。這種也需要處理下。

// 時間轉義處理
export function timeChn (val) { if (!val) { return false } let _time = val.replace(/\-/g, "/") // 將實際時間轉為中國標准時間 _time = _time + ' GMT+0800' let realTime = new Date(_time).getTime() // 當前時間也轉為中國標准時間
  let _nowTime = new Date().toLocaleString('chinese', {hour12: false}) _nowTime = _nowTime + ' GMT+0800' let nowTime = new Date(_nowTime).getTime() let diffValue = nowTime - realTime if (diffValue < 0) { return } let _min = diffValue / (60 * 1000) // 以min為維度
  if (_min < 1) { return '剛剛' } else if (_min >=1 && _min < 10) { return '1分鍾前' } else if (_min >= 10 && _min < 30) { return '10分鍾前' } else if (_min >= 30 && _min < 60) { return '半小時前' } else if (_min >= 60 && _min < 60 * 24) { return Math.floor(_min / 60) + '小時前' } else if (_min >= 60 * 24 && _min < 60 * 24 * 7) { return Math.floor(_min / (60*24)) + '天前' } else { return val } }

  由於服務器是東8區時間,瀏覽器new Date()解析則是默認當前時區時間,所以我們需要轉一下,將服務器時間,轉為東八區時間。瀏覽器當前的時間也得轉一下,轉成東8區時間,然后再通過ms值去相減。

  這里有個小技巧就是,直接在字符串里拼時區即可,如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM