js 时间戳转换 格林威治时间转换

1,905 阅读1分钟

背景

Moment.js很重(源码为4600行左右),所以有很多替代方案的,如:Dayjs、miment等,所以可以根据浏览器的兼容情况自行写个轻量级的库。

1、 简单通过时间对象转换需要的时间格式。

// 时间戳 转时间
export function farmatDate(time, zone = 8, fmt) {
 const getCurrentZoneTimestrap = getGLWZTime(time, zone);
 const date = new Date(getCurrentZoneTimestrap);
 if(/(y+)/.test(fmt))
   fmt = fmt.replace(RegExp.$1, `${date.getFullYear()}`);
 let o = {
  'M+': getMonth() + 1,
  'd+': getDay(),
  'h+': getHours(),
  'm+': getMinutes(),
  's+': getSeconds()
 };
 let str;
 for(let key in o) {
  if(RegExp(`(${key})`).test(fmt)) {
     str = `${o[key]}`;
     fmt = fmt.replace(RegExp.$1, str.length === 2 ? str:addLeftZero(str))
  }
 }
 return fmt;
}
function addLeftZero(str) {
 return `00${str}`.substr(str.length);
}

// 不同时区下 对时间戳的处理
// getTimezoneOffset() 方法可返回格林威治时间和本地时间之间的时差,以分钟为单位。
// param { timestrap 需要转换的时间, zone转换的时区}
export const getGLWZTime = (timestrap:number, zone:number) => {
  const hours = new Date().getTimezoneOffset() / 60; // 计算格林威治时间和本地时间之间相差几个小时 如果是北京东八时区 返回 -8
  const millisecond = hours * 3600000; // 毫秒为单位的时差
  const standardTime = timestrap + millisecond;// 格林威治时间 = 传入时间戳 + 本地与格林威治时差
  const targetZone = standardTime + zone * 3600000; // 目标zone时区时间戳 = 格林威治时间 + 目标时区与格林威治时差
  return targetZone;
};