js處理時間時區問題

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

1、基本概念服務器

一、格林威治時間spa

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

二、得到本地與格林威治時間的時差:new Date().getTimezoneOffset(),單位爲分鐘。blog

三、已知本地時間,換算對應格林威治時間:字符串

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

四、已知本地時間,換算其餘時區的時間io

  其餘時區時間 + 其餘時區時差 = 本地時間 + 本地時差ast

  其餘時區時間 = 本地時間 + 本地時差 - 其餘時區時差function

五、注意: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)

2、還有一種問題場景就是:時間轉義漢字,好比剛剛、幾分鐘前等。若是服務器是存的東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值去相減。

  這裏有個小技巧就是,直接在字符串裏拼時區便可,以下:

相關文章
相關標籤/搜索