示例1: <!-- 在WXML中声明wxs模块 --> <wxs module="timeUtils"> var formatTime = function(timestamp, format) { var date = getDate(timestamp * 1000); var year = date.getFullYear() var month = date.getMonth() + 1 var day = date.getDate() var hour = date.getHours() var minute = date.getMinutes() var second = date.getSeconds() // 自动补零 function addZero(value) { return value < 10 ? '0' + value : value; } return format .replace('YYYY', year) .replace('MM', addZero(month)) .replace('DD', addZero(day)) .replace('HH', addZero(hour)) .replace('mm', addZero(minute)) .replace('ss', addZero(second)); } // 相对时间计算(需要传入当前时间戳) var relativeTime = function(timestamp, currentTime) { var diff = currentTime - timestamp; var minute = 60; var hour = minute * 60; var day = hour * 24; if (diff < 0) return '未来时间'; if (diff < 30) return '刚刚'; if (diff < minute) return diff + '秒前'; if (diff < hour) return Math.floor(diff / minute) + '分钟前'; if (diff < day) return Math.floor(diff / hour) + '小时前'; return Math.floor(diff / day) + '天前'; } // 获取星期几 var getWeekDay = function(timestamp) { var days = ['日', '一', '二', '三', '四', '五', '六']; return '星期' + days[getDate(timestamp * 1000).getDay()]; } module.exports = { formatTime: formatTime, relativeTime: relativeTime, getWeekDay: getWeekDay }; </wxs> <!-- 使用示例 --> <view>格式化时间:{{timeUtils.formatTime(1676985600, 'YYYY-MM-DD HH:mm')}}</view> <view>相对时间:{{timeUtils.relativeTime(1676985600, 1708560000)}}</view> <view>星期几:{{timeUtils.getWeekDay(1676985600)}}</view>
方法说明:
formatTime
功能:格式化时间戳
参数:秒级时间戳、格式字符串(支持YYYY/MM/DD/HH/mm/ss)
示例输出:2023-02-21 15:20
relativeTime
功能:计算相对时间
参数:目标时间戳、当前时间戳(均需秒级)
示例输出:3天前
getWeekDay
功能:获取中文星期
参数:秒级时间戳
示例输出:星期二
注意事项:
WXS中时间戳需用秒级(与JS的毫秒级不同)
使用getDate()
代替new Date()
若需要处理时区,建议在JS层转换后传入时间戳
根据需求可直接复制代码到.wxs
文件中,通过模块化调用提高复用性。
示例2:
<wxs module="timeAdvanced"> // ====================== // 倒计时计算(秒级) // ====================== var countdown = function(seconds) { var d = Math.floor(seconds / 86400) var h = Math.floor((seconds % 86400) / 3600) var m = Math.floor((seconds % 3600) / 60) var s = seconds % 60 function fill(value) { return value < 10 ? '0' + value : value } return (d > 0 ? d + "天 " : "") + fill(h) + ":" + fill(m) + ":" + fill(s) } // ====================== // 月份转中文缩写 // ====================== var monthToCN = function(timestamp) { var months = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'] return months[getDate(timestamp * 1000).getMonth()] + '月' } // ====================== // 季度计算 // ====================== var getQuarter = function(timestamp) { var month = getDate(timestamp * 1000).getMonth() + 1 return '第' + Math.ceil(month / 3) + '季度' } // ====================== // 时间段判断 // ====================== var timeRange = function(timestamp) { var hour = getDate(timestamp * 1000).getHours() if (hour < 5) return '凌晨' if (hour < 8) return '清晨' if (hour < 11) return '上午' if (hour < 13) return '中午' if (hour < 18) return '下午' return '晚上' } module.exports = { countdown: countdown, monthToCN: monthToCN, getQuarter: getQuarter, timeRange: timeRange } </wxs>
countdown | 剩余秒数 | timeAdvanced.countdown(86500) | 1天 00:03:40 | 限时活动倒计时 |
monthToCN | 秒级时间戳 | timeAdvanced.monthToCN(1734567890) | 八月 | 报表月份显示 |
getQuarter | 秒级时间戳 | timeAdvanced.getQuarter(1734567890) | 第3季度 | 财务季度统计 |
timeRange | 秒级时间戳 | timeAdvanced.timeRange(1734567890) | 下午 | 聊天消息时间分段 |
示例3
// 是否今天判断(需传入当前时间戳) var isToday = function(timestamp, currentStamp) { var targetDay = getDate(timestamp * 1000).getDate() var currentDay = getDate(currentStamp * 1000).getDate() return targetDay === currentDay } // 年龄计算(精确到年) var getAge = function(birthTimestamp) { var birth = getDate(birthTimestamp * 1000) var now = getDate() var age = now.getFullYear() - birth.getFullYear() return now.getMonth() > birth.getMonth() || (now.getMonth() === birth.getMonth() && now.getDate() >= birth.getDate()) ? age : age - 1 }
倒计时参数:countdown()
接收总秒数而非时间戳差
时区处理:所有方法均使用设备本地时区
性能优化:高频更新建议在JS层计算后传值
时间戳单位:所有方法均要求秒级时间戳
根据具体场景选择方法,如需要处理跨年计算可扩展getDate().getFullYear()
相关逻辑。
示例4:
<wxs module="timeExtend"> /* ======================== * 时辰转换(中国十二时辰) * ======================== */ var chineseHour = function(timestamp) { var hours = getDate(timestamp * 1000).getHours() var shichen = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'] return shichen[Math.floor((hours + 1) % 24 / 2)] + '时' } /* ======================== * ISO标准格式输出 * ======================== */ var toISOString = function(timestamp) { var d = getDate(timestamp * 1000) return d.getFullYear() + '-' + (d.getMonth()+9).toString().substr(-2) + '-' + ('0'+d.getDate()).substr(-2) + 'T' + ('0'+d.getHours()).substr(-2) + ':' + ('0'+d.getMinutes()).substr(-2) + ':' + ('0'+d.getSeconds()).substr(-2) + 'Z' } /* ======================== * 闰年判断 * ======================== */ var isLeapYear = function(timestamp) { var year = getDate(timestamp * 1000).getFullYear() return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 } /* ======================== * 当月天数 * ======================== */ var monthDays = function(timestamp) { var d = getDate(timestamp * 1000) return getDate(d.getFullYear(), d.getMonth() + 1, 0).getDate() } module.exports = { chineseHour: chineseHour, toISOString: toISOString, isLeapYear: isLeapYear, monthDays: monthDays } </wxs>
chineseHour | 秒级时间戳 | timeExtend.chineseHour(17300000) | 巳时 | 传统文化展示 |
toISOString | 秒级时间戳 | timeExtend.toISOString(17000000) | 2024-08-09T02:46:40Z | 接口数据标准化 |
isLeapYear | 秒级时间戳 | timeExtend.isLeapYear(1672500000) | true | 日历组件验证 |
monthDays | 秒级时间戳 | timeExtend.monthDays(1704067200) | 29 | 日期选择器控件 |
示例5
// 时间段交集判断(适合预约系统) var timeOverlap = function(start1, end1, start2, end2) { return !(end1 <= start2 || end2 <= start1) } // 生日提醒(距离天数) var birthdayRemind = function(birthTimestamp, currentTimestamp) { var birth = getDate(birthTimestamp * 1000) var now = getDate(currentTimestamp * 1000) // 今年生日是否已过 var thisYearBirth = getDate(now.getFullYear(), birth.getMonth(), birth.getDate()) return thisYearBirth < now ? Math.ceil((getDate(now.getFullYear()+1, birth.getMonth(), birth.getDate()) - now) / 86400000) : Math.ceil((thisYearBirth - now) / 86400000) }
时辰算法:采用(小时+1)/2
取整实现23:00-01:00为子时
ISO精度:强制UTC时区(末尾Z标识),适合接口传输
闰年规则:严格遵循格里高利历法标准
性能提示:monthDays()
通过下月第0天特性获取当月天数
<!-- 实战示例 --> <view>农历时辰:{{timeExtend.chineseHour(17300000)}}</view> <view>ISO格式:{{timeExtend.toISOString(17000000)}}</view> <view>闰年状态:{{timeExtend.isLeapYear(1672500000) ? '是' : '否'}}</view> <view>本月天数:{{timeExtend.monthDays(1704067200)}}</view>
示例6
<wxs module="timePro"> // ■■■■■■■■■■■■■■■■■■■■■ // 🕒 时效敏感型方法(适配2025) // ■■■■■■■■■■■■■■■■■■■■■ // 春节倒计时(公历转农历简化版) var springFestivalCountdown = function(currentTimestamp) { var lunar2025 = getDate(1738368000) // 2025-02-17 00:00:00(农历春节) var now = getDate(currentTimestamp * 1000) var diff = Math.floor((lunar2025 - now) / 1000) return diff > 0 ? "还剩" + Math.ceil(diff/86400) + "天" : "已过春节" } // ■■■■■■■■■■■■■■■■■■■■■ // 🎯 通用型方法(永久有效) // ■■■■■■■■■■■■■■■■■■■■■ // 时间差计算(返回天/时/分对象) var timeDiff = function(start, end) { var seconds = end - start return { days: Math.floor(seconds / 86400), hours: Math.floor(seconds % 86400 / 3600), minutes: Math.floor(seconds % 3600 / 60) } } // 12小时制转换 var to12Hour = function(timestamp) { var hour = getDate(timestamp * 1000).getHours() return { period: hour >= 12 ? 'PM' : 'AM', hour: hour % 12 || 12 } } // 周数计算(ISO标准) var getWeekNumber = function(timestamp) { var d = getDate(timestamp * 1000) d.setHours(0, 0, 0, 0) d.setDate(d.getDate() + 4 - (d.getDay() || 7)) var yearStart = getDate(d.getFullYear(), 0, 1) return Math.ceil(((d - yearStart) / 86400000 + 1) / 7) } module.exports = { springFestivalCountdown: springFestivalCountdown, timeDiff: timeDiff, to12Hour: to12Hour, getWeekNumber: getWeekNumber } </wxml>
springFestivalCountdown | timePro.springFestivalCountdown(1738569600) | "还剩3天" | 节日营销活动 |
timeDiff | timePro.timeDiff(1738569600, 1738656000) | {days:1, hours:0, minutes:0} | 项目工期计算 |
to12Hour | timePro.to12Hour(1738569600) | {period:'PM', hour:3} | 医疗预约系统 |
getWeekNumber | timePro.getWeekNumber(1738569600) | 8 | 生产周报生成 |
<view>春节倒计时:{{timePro.springFestivalCountdown(1738569600)}}</view> <view>12小时制:{{timePro.to12Hour(1738569600).hour}} {{timePro.to12Hour(1738569600).period}}</view> <view>当前周数:{{timePro.getWeekNumber(1738569600)}}</view>
春节计算:采用2025年公历2月17日为农历春节的近似值(真实农历需复杂计算)
周数算法:符合ISO 8601标准,确保跨年周数正确(如2025-01-06属于第2周)
时效处理:springFestivalCountdown
方法在2025年2月17日后自动切换状态
12小时制:午夜12点显示为12AM,正午显示为12PM
可根据需要扩展timeDiff
的输出格式(如增加秒数),或添加时区转换功能(需传入时区偏移参数)
示例7
<wxs module="timeSimple"> // ▼▼▼ 基础日期格式化 ▼▼▼ var format = function(timestamp, pattern) { var d = getDate(timestamp * 1000) var map = { 'Y': d.getFullYear(), 'm': ('0' + (d.getMonth() + 1)).substr(-2), 'd': ('0' + d.getDate()).substr(-2), 'H': ('0' + d.getHours()).substr(-2), 'i': ('0' + d.getMinutes()).substr(-2), 's': ('0' + d.getSeconds()).substr(-2) } return pattern.replace(/[YmdHis]/g, function(m) { return map[m] }) } // ▼▼▼ 星期中文转换 ▼▼▼ var getWeekCN = function(timestamp) { return ['日','一','二','三','四','五','六'][getDate(timestamp * 1000).getDay()] } // ▼▼▼ 时间戳转日期对象 ▼▼▼ var toDate = function(timestamp) { return getDate(timestamp * 1000) } module.exports = { format: format, getWeekCN: getWeekCN, toDate: toDate } </wxs>
基础格式化 | timeSimple.format(17300000, 'Y-m-d H:i') | 2025-02-21 15:33 |
智能星期 | timeSimple.getWeekCN(17300000) | 五 |
原始日期对象 | timeSimple.toDate(17300000) | Fri Feb 21 2025 15:33:20 GMT+0800 |
textCopy CodeY ➔ 完整年份(2025) m ➔ 两位月份(02) d ➔ 两位日期(21) H ➔ 24小时制(15) i ➔ 分钟(33) s ➔ 秒(05)
链式调用:组合多个简单方法
<view>{{timeSimple.format(17300000, 'm月d日')}} 周{{timeSimple.getWeekCN(17300000)}}</view> <!-- 输出:02月21日 周五 -->
日期对象扩展:配合原生方法
<view>{{timeSimple.toDate(17300000).getMonth()+1}}月</view> <!-- 输出:2月 -->
快捷模式:常用格式预设
// 添加在module.exports前 var quickFormat = { date: function(t) { return format(t, 'Y-m-d') }, time: function(t) { return format(t, 'H:i:s') } } module.exports.quick = quickFormat // 调用示例 {{timeSimple.quick.date(17300000)}} <!-- 2025-02-21 -->
示例8
<wxs module="miniTime"> // 🌟 超简版时间格式化 var simple = { // 智能日期(自动输出 今天/昨天/具体日期) smartDate: function(t) { var now = getDate() var target = getDate(t * 1000) var diffDay = Math.floor((now - target) / 86400000) return diffDay === 0 ? '今天' : diffDay === 1 ? '昨天' : target.getFullYear() === now.getFullYear() ? (target.getMonth()+1) + '月' + target.getDate() + '日' : target.getFullYear() + '-' + (target.getMonth()+1) + '-' + target.getDate() }, // 基础时分秒 clock: function(t) { var d = getDate(t * 1000) return ('0'+d.getHours()).substr(-2) + ':' + ('0'+d.getMinutes()).substr(-2) } } module.exports = simple </wxs>
<!-- 消息时间展示 --> <view>{{miniTime.smartDate(17300000)}} {{miniTime.clock(17300000)}}</view> <!-- 输出结果(当前为2025-02-21) --> → 今天 15:33 (当传入今日时间戳时) → 昨天 18:45 (当传入昨日时间戳时) → 2月21日 09:00 (当传入同年非近日时间戳) → 2024-12-01 14:30 (当传入跨年时间戳)
零配置:无需记忆格式化符号,自动智能输出
场景优化:特别适合社交类、聊天记录等需要自然语言时间的场景
代码精简:仅2个方法,总代码行数不足20行
性能优异:无复杂计算,适合高频次调用
// 添加在module.exports前(按需扩展) simple.timeAgo = function(t) { var diff = Math.floor((getDate() - getDate(t * 1000)) / 1000) return diff < 60 ? '刚刚' : diff < 3600 ? Math.floor(diff/60) + '分钟前' : diff < 86400 ? Math.floor(diff/3600) + '小时前' : simple.smartDate(t) }
<view>{{miniTime.timeAgo(17300000)}}</view> <!-- 根据当前时间自动显示为:3小时前 / 昨天 15:33 等 -->
示例9:
<wxs module="timestamp"> // 🌟 极简时间戳生成方案(适配2025年环境) var ts = { // 获取当前秒级时间戳(需从逻辑层传入当前时间) now: function(currentTime) { return Math.floor(currentTime / 1000) }, // 日期转时间戳(支持2025-02-21格式) parse: function(dateString) { return Math.floor(getDate(dateString).getTime() / 1000) } } module.exports = ts </wxml>
<!-- 在WXML中使用 --> <view>当前时间戳:{{timestamp.now(currentTime)}}</view> <view>春节时间戳:{{timestamp.parse('2025-02-17')}}</view> <!-- 在JS逻辑层需要传递当前时间 --> Page({ data: { currentTime: new Date().getTime() // 传递毫秒级时间戳 } })
now | 毫秒级时间戳 | 秒级时间戳 | 订单创建时间、日志记录 |
parse | 日期字符串 | 秒级时间戳 | 固定日期倒计时计算 |
时效性处理:now
方法依赖逻辑层传入的实时时间,避免在wxs直接获取时间
时区统一:所有时间默认使用系统时区(中国标准时间 UTC+8)
精度控制:返回值统一为秒级时间戳,与微信云开发时间格式保持一致
日期格式:parse
方法支持YYYY-MM-DD
或YYYY-MM-DD HH:mm:ss
// 生成今日0点时间戳const todayStart = ts.parse('2025-02-21 00:00:00') // 返回1738608000// 计算7天后的时间戳const weekLater = ts.now(new Date().getTime()) + 604800
2025-02-21 00:00:00 | 1738608000 |
2025-02-17 00:00:00 | 1738368000 |
2025-01-01 00:00:00 | 1735660800 |
// 添加有效期验证(基于当前2025年) ts.isValid = function(target) { var current = ts.now(new Date().getTime()) return target > current // 验证目标时间戳是否在当前之后 } // 调用示例 {{timestamp.isValid(1738608000)}} // 验证指定时间戳是否有效