
本文介绍如何利用 luxon 库精准计算当前十年的起始日期(即最近一个整十年的 1 月 1 日),并通过 datetime api 构造对应时间对象,支持时区感知与格式化输出。
本文介绍如何利用 luxon 库精准计算当前十年的起始日期(即最近一个整十年的 1 月 1 日),并通过 datetime api 构造对应时间对象,支持时区感知与格式化输出。
Luxon 本身未提供内置的 startOf('decade') 方法(区别于 startOf('year') 或 startOf('month')),但可通过简单数学运算推导出当前所属十年的起始年份:将当前年份对 10 取模后从原年份中减去余数,即可得到该十年的第一年。例如,2024 年 → 2024 - (2024 % 10) = 2020;1997 年 → 1997 - 7 = 1990。
以下为完整实现代码(含 HTML 引入示例):
<title>Luxon Decade Start</title><script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.4.4/luxon.min.js" integrity="sha512-dUlSLLkxslGILhPdCkALwk4szPhp3xmZIKFtlUD+O9Lslq41Aksmdt5OGqpomDoT4FsCUH70jQU8ezZHI3v1RQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script><script>
document.addEventListener('DOMContentLoaded', function() {
const { DateTime } = luxon;
const now = DateTime.local(); // 使用 local() 确保基于用户本地时区计算
const firstYearOfDecade = now.year - (now.year % 10);
const firstDayOfDecade = DateTime.local(firstYearOfDecade, 1, 1); // 年-月-日
console.log(`十年起始日:${firstDayOfDecade.toISODate()}(${firstDayOfDecade.weekdayLong})`);
// 输出示例:2020-01-01(Wednesday)
});
</script>
✅ 注意事项:
- 该方法以“十年为 10 年一组、从年份能被 10 整除开始”为标准(如 2020–2029、2030–2039),符合国际常用十年划分惯例;
- 若需 UTC 时区下的十年起点,请改用
DateTime.utc()替代DateTime.local(); - 不建议直接拼接字符串构造日期(如
'2020-01-01'),应始终通过 Luxon 的构造函数创建实例,以确保时区、历法及无效日期校验的可靠性。
? 拓展提示:如需封装为可复用工具函数,可定义如下:
const startOfDecade = (dt = DateTime.local()) =>
DateTime.local(dt.year - (dt.year % 10), 1, 1);
console.log(startOfDecade().toISODate()); // 2020-01-01
console.log(startOfDecade(DateTime.fromISO('1987-05-12')).toISODate()); // 1980-01-01
此方案简洁、可靠,且完全兼容 Luxon 的不可变性与链式操作特性。










