更新记录

1.0.0(2026-07-19)

首发:自研高性能原生 cron 核心:表达式解析与下次触发时间计算,提供 uni-app 可调的 JS API。


平台兼容性

uni-app x(5.14)

Chrome Safari Android iOS 鸿蒙 微信小程序
5.0 12 × ×

nex-cron —— 高性能 Cron 定时表达式

自研高性能原生核心,实现 cron 表达式解析与下次触发时间计算,提供 uni-app 可调的 JS API。 支持 App 端(Android / iOS)H5 端5 个 API 全量可用——核心不取当前时间、纯时间戳计算; H5 端建议应用启动时 await ensureReady() 一次);小程序不支持。

同一份 utssdk 插件同时支持 uni-app x(uvue)经典 uni-app(vue3),无需分叉。 全部「值进 / 值出」:expr 为字符串,时间 / 窗口 / 次数为 number,返回 JSON 字符串 / boolean / 版本串。 自研核心,无额外系统依赖。

诚实边界:本插件只算「下次触发时间」(纯计算、离线可测)。真正的后台定时唤醒 (Android AlarmManager / iOS BGTaskScheduler / 前台定时器)需在 UTS / 平台侧自行接线—— 用本插件算出下次触发的 unix 毫秒,再交给平台定时器。

表达式语法(重要:6 段或 7 段,含秒)

秒  分  时  日  月  周  [年]
sec min hour dom mon dow [year]
  • year可选(缺省 = 全部年份)。内部年份范围 1970–2100。
  • *5 段标准 cron(如 `0 0 `)不被支持**——至少需 6 段(本插件含「秒」位)。
  • 支持 * 通配、?(仅 日/周 位)任意、a-b 范围、a,b 列表、*/n 步长、命名月/周(Jan/MonMay-Aug/Mon,Wed,Fri), 以及简写 @yearly/@monthly/@weekly/@daily/@hourly
  • 时间一律按 UTC 计算(入参 / 出参均为 UTC unix 毫秒时间戳)。

API

JS API 签名 说明
cronNext cronNext(expr, fromUnixMs, count): string fromUnixMs 严格之后的下 count 次触发,JSON 数组 [unixMs,...](升序)。count 为 0 → "[]";> 1000 / 非法表达式 / 越界 → 抛错
cronValidate cronValidate(expr): boolean 表达式是否合法。永不抛错
cronDescribe cronDescribe(expr): string 6/7 段表达式分解为 JSON {sec,min,hour,dom,mon,dow[,year]}。非法 / 简写 → 抛错
cronIsDue cronIsDue(expr, unixMs, windowMs): boolean [unixMs, unixMs+windowMs]两端闭区间)内是否有触发。非法 / 越界 / 负窗口 → false
cronCoreVersion cronCoreVersion(): string 核心版本号

边界语义

  • cronNext:返回严格晚于 fromUnixMs 的触发(不含 from 自身)。
  • cronIsDue:闭区间 [unixMs, unixMs+windowMs];触发按整秒对齐,unixMs 毫秒部分参与比较(毫秒级精度)。

用法

import {
  cronNext, cronValidate, cronDescribe, cronIsDue
} from "@/uni_modules/nex-cron";

const now = Date.now(); // UTC unix 毫秒

// 算下 5 次触发(每小时整点)
const next5 = JSON.parse(cronNext("0 0 * * * *", now, 5)) as number[];
// 把 next5[0] 交给平台定时器(AlarmManager / BGTaskScheduler)

// 校验
cronValidate("*/15 * * * * *"); // true(每 15 秒)
cronValidate("0 0 * * *");      // false(5 段不支持)

// 字段分解
const fields = JSON.parse(cronDescribe("0 30 9 * * Mon-Fri"));
// { sec:"0", min:"30", hour:"9", dom:"*", mon:"*", dow:"Mon-Fri" }

// 命中判断:未来 60 秒内是否会触发(用于轮询式定时)
if (cronIsDue("0 * * * * *", now, 60000)) { /* 下一分钟整点在窗口内 */ }

黄金向量(UTC,已验证)

锚点 2024-01-01T00:00:00Z = 1704067200000

  • cronNext("0 0 * * * *", 1704069000000 /*00:30*/, 3)[1704070800000,1704074400000,1704078000000]
  • cronNext("*/15 * * * * *", 1704067200000 /*00:00*/, 4)[1704067215000,1704067230000,1704067245000,1704067260000]
  • cronNext("0 0 * * * *", 1704070800000 /*01:00 恰触发点*/, 1)[1704074400000](严格之后 → 02:00)。

平台与调试边界

  • App 端支持 app-android / app-ios;H5 端 5 个 API 全量可用;各家小程序不支持。
  • Android 本地真机调试需 HBuilderX ≥ 4.26(自定义调试基座),云打包不受此限。
  • iOS 端含 Swift 组件,宿主原生工程需开启「支持 Swift」。
  • 最终 App 打包由 HBuilderX / @dcloudio CLI 完成。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据。所有计算/处理均在本地完成,无任何网络请求、不发送数据到任何服务器。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。