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)的方式转成日期格式,则传递的是当地的时间,不是北京时间。当聊天系统在泰国使用时,传递就是泰国的时间,则导致查询的结果不对,因此,需要将查询的时间统一转成北京时间。