完整代码:
var _utcToDate = function (utc) { return getDate(utc.slice(0, -5) + 'Z'); }; var _formatNumber = function (num) { return +num < 10 ? '0' + num : '' + num; }; // 关于 getDate 方法的使用 // <https://developers.weixin.qq.com/miniprogram/dev/reference/wxs/06datatype.html#date> var _getRegularDate = function (date, type) { var realDate; if (type === 'UTC') { realDate = _utcToDate(date); } else if (type === 'TimestampByS') { realDate = getDate(date * 1000); } else if (type === 'TimestampByMS') { realDate = getDate(date); } else { realDate = getDate(date); } return realDate; }; var stringifyDate = function (date, type, format = 'yyyy-MM-dd hh:mm:ss') { var realDate = _getRegularDate(date, type); var date = [ ['M+', _formatNumber(realDate.getMonth() + 1)], ['d+', _formatNumber(realDate.getDate())], ['h+', _formatNumber(realDate.getHours())], ['m+', _formatNumber(realDate.getMinutes())], ['s+', _formatNumber(realDate.getSeconds())], ['q+', Math.floor((realDate.getMonth() + 3) / 3)], ['S+', realDate.getMilliseconds()] ]; var regYear = getRegExp('(y+)', 'i'); var reg1 = regYear.exec(format); if (reg1) { format = format.replace(reg1[1], (realDate.getFullYear() + '').substring(4 - reg1[1].length)); } for (var i = 0; i < date.length; i++) { var k = date[i][0]; var v = date[i][1]; var reg2 = getRegExp('(' + k + ')').exec(format); if (reg2) { format = format.replace( reg2[1], reg2[1].length == 1 ? v : ('00' + v).substring(('' + v).length) ); } } return format; }; module.exports = { stringifyDate: stringifyDate };
代码并不复杂,其中最核心的部分就是先把各种各样的原始时间格式转化为标准的 Date
对象,然后再通过正则匹配给定的时间模板得到最终的字符串。
如果需要支持更多的时间格式,理论上只需要扩展 _getRegularDate
方法即可。在上面的代码中支持三种时间格式:
- UTC:
2021-04-11T10:00:49.000+0000
。这种时间格式用了额外的_utcToDate
方法来处理。关于这种时间格式,以及在小程序中的处理,可以查看这篇文章:从微信小程序里的 UTC 日期说起 - TimestampByS:
1611544428
。精确到秒的 10 位时间戳 - TimestampByMS:
1616053302090
。最常见的精确到毫秒的 13 位时间戳
使用示例:
<wxs src="../../wxs/moment.wxs" module="moment"></wxs> <view>{{moment.stringifyDate(time, 'TimestampByMS', 'MM月dd日 hh:mm')}}</view>