示例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)}} // 验证指定时间戳是否有效