时间戳timestamp转成北京时间

1,163 阅读1分钟

1. new Date(timestamp) 

返回本机时间,带时区的时间。当所处的时区不同,返回的时间也不同。

function formatDate(date, fmt = 'yyyy-MM-dd'){  if (!date || !(date instanceof Date)) {    return date  }  let ret  let opt = {    'y+': date.getFullYear().toString(), // 年    'M+': (date.getMonth() + 1).toString(), // 月    'd+': date.getDate().toString(), // 日    'H+': date.getHours().toString(), // 时    'm+': date.getMinutes().toString(), // 分    's+': date.getSeconds().toString(), // 秒  }  for (let k in opt) {    ret = new RegExp('(' + k + ')').exec(fmt)    if (ret) {      fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))    }  }  return fmt}

new Date(1612429614000)  // Thu Feb 04 2021 17:06:54 GMT+0800 (中国标准时间)

// 在中国
formatDate(new Date(1612429614000),'yyyy-MM-dd HH:mm:ss') // "2021-02-04 17:06:54"

// 在泰国
formatDate(new Date(1612429614000),'yyyy-MM-dd HH:mm:ss') // "2021-02-04 16:06:54"

2. 将时间戳timestamp转成北京时间

// cdn引入moment
<script src="https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"></script>
moment(timestamp).utcOffset('+08:00').format('YYYY-MM-DD HH:mm:ss')

3. 场景问题(前提条件:后端处理时没考虑时区)

在聊天系统中,获取聊天消息的接口需要传递一个时间参数,一个type表示前后方向的参数。当需要往后加载更多聊天数据时,前端需要将当前聊天消息列表的最后一条消息的发送时间传给后端,由于后端返回的发送时间是时间戳,若通过new Date(timestamp)的方式转成日期格式,则传递的是当地的时间,不是北京时间。当聊天系统在泰国使用时,传递就是泰国的时间,则导致查询的结果不对,因此,需要将查询的时间统一转成北京时间。