v2.1.0
反向推算与锚点
- 新增
Schedule.previousTarget(before, zone):不晚于 before 的最近一次出现(含恰等于);与 nextTarget 遍历同一条出现序列、复用同一套快路径,消费方无需再以「区间二分 nextTarget」硬凑完结事件锚点;before 早于锚点返回 null(可回退anchor(zone));推算至 9999 上界返回界内最后一次出现(不抛异常,与正向越界语义不同) - 新增
Schedule.anchor(zone):出现序列的第一次出现;夏令时缺口日按缺口顺延(02:30 → 03:30),恒等于nextTarget(锚点前一瞬)
正向推算带上限
nextTarget(now, zone, until):重复出现晚于 until 时返回 null(序列单调,后续必然超限);锚点与非重复日程不受约束——重复结束不能追溯取消锚点,takeIf { it <= end }式封顶会误杀锚点,语义由库钉死
倒计时
countdown(target, now, rounding)新增进一模式Rounding.CEIL_FUTURE:未到方向向上取整(差一秒满整单位也进位:86399 秒 + 1 纳秒 = 1 天;24 时 → 1 天、60 分 → 1 时边界进位),已过方向恒截断;默认TRUNCATE保持历史行为- 新增
calendarCountdown(target, now, zone)→CalendarCountdown:年/月/日/时/分/秒钟面分量,闰年与月长由日历处理,月末钳制与 java.timePeriod一致——跨平台替代 JVM 专属 API;跨夏令时一天计 1 天 0 小时(与countdown()真实时长语义对照)
测试与文档
- 测试 101 → 138(× JVM / Android / wasm 三平台,iOS 由 macOS CI 执行):封顶三态与误杀反例、反向边界(含等于/锚点前一瞬/DST 重叠日/收缩回弹/越界收尾/闰六月格点年)、六日程正反对偶不变量、进一三层取整、日历分量对拍;农历年表与 periodUntil 语义先探针实测再落断言
- README 重构:按新手使用路径重排、精简章节,版本历史收敛为版本索引
- 全部为增量 API,无破坏性变更(
nextTarget/countdown仅追加默认参数)
Full Changelog: v2.0.1...v2.1.0