
在 Luxon.js 中,day 与 days、minute 与 minutes 等 duration 单位的单复数形式完全等价,内部会自动标准化为复数形式,因此二者行为一致,可安全混用。
在 luxon.js 中,`day` 与 `days`、`minute` 与 `minutes` 等 duration 单位的单复数形式完全等价,内部会自动标准化为复数形式,因此二者行为一致,可安全混用。
Luxon 的 Duration 构造逻辑对时间单位名称做了智能归一化处理。当你调用 DateTime.now().plus({ day: 1 }) 或 DateTime.now().plus({ days: 1 }) 时,底层源码(见 duration.js#L399)会通过预定义的映射表将所有常见单数单位(如 'day', 'hour', 'minute', 'second', 'millisecond', 'week', 'month', 'year')自动转换为对应复数形式('days', 'hours', 'minutes', 等)。这意味着:
- ✅
day/days、hour/hours、week/weeks等均被识别为同一语义单位; - ✅ 混用单复数不会报错,也不会导致计算偏差;
- ✅ 推荐统一使用复数形式(如
{ days: 1, hours: 2 }),以提高代码可读性与团队一致性。
示例代码:
import { DateTime } from 'luxon';
const now = DateTime.now();
console.log(now.plus({ day: 1 }).toISO()); // 24 小时后(单数)
console.log(now.plus({ days: 1 }).toISO()); // 同样是 24 小时后(复数)
console.log(now.plus({ hour: 3 }).toISO()); // 等价于 { hours: 3 }⚠️ 注意事项:
- 该映射仅覆盖标准时间单位(
year,month,week,day,hour,minute,second,millisecond),自定义键(如{ d: 1 }或{ dy: 1 })不会被识别或转换; - 虽然单复数等价,但 Luxon 的类型定义(如 TypeScript)和官方文档示例均优先采用复数形式,建议遵循惯例以增强兼容性与可维护性;
- 在
Duration.fromObject()或Interval.splitBy()等涉及 duration 解析的 API 中,同样适用此规则。
总结:Luxon 通过内置规范化机制消除了单复数歧义,开发者可专注业务逻辑,无需为单位词形过度担忧——但为清晰起见,推荐始终使用标准复数形式。


















