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