Luxon
由 Moment.js 核心贡献者打造的现代日期时间处理库,基于浏览器原生 Intl API 构建。
Luxon 由 Moment.js 核心贡献者开发,基于浏览器原生 Intl API 构建。提供不可变 DateTime 对象、内置时区支持、日历感知的 Duration 运算和 Interval 系统,是处理复杂时区和国际化场景的强力工具。
Luxon
由 Moment.js 核心贡献者打造的现代日期时间处理库,基于浏览器原生 Intl API 构建。
技术简介说明
Luxon 是由 Moment.js 核心贡献者 Isaac Cambron 开发的日期时间处理库,旨在解决 Moment.js 在设计上的根本性缺陷——可变性、不可 tree-shaking、以及缺乏对现代 Web API 的利用。Luxon 汲取了 Moment.js 的经验教训,从零开始重新设计了 API。
Luxon 的核心设计哲学是充分利用浏览器原生的 Intl API。这意味着时区数据、国际化格式、日历系统等重量级功能都直接委托给浏览器引擎,而不需要在 JavaScript 中维护庞大的数据文件。这不仅大幅减小了包体积,还保证了与平台行为的一致性。
Luxon 提供不可变的 DateTime 对象,拥有流畅的链式 API,同时支持高级的日期数学运算(如跨时区的精确时间计算、复杂 duration 运算等)。它是处理复杂时区场景和国际日期格式化的强大力器。
基本信息
| 项目 | 详情 |
|---|---|
| 官网 | https://moment.github.io/luxon/ |
| GitHub | https://github.com/moment/luxon |
| License | MIT |
| 最新版本 | v3.7.2(2025 年 7 月) |
| 主要维护者 | Moment.js 团队(Isaac Cambron 创建) |
| npm 周下载量 | ~600 万+ |
| GitHub Stars | 14,000+ |
快速上手
安装
# npm
npm install luxon
# yarn
yarn add luxon
# pnpm
pnpm add luxon
# CDN
<script src="https://cdn.jsdelivr.net/npm/luxon@3/build/global/luxon.min.js"></script>基础配置
// Luxon 不需要全局配置
// 时区和国际化通过浏览器 Intl API 自动处理
import { DateTime, Duration, Interval, Settings } from 'luxon'
// 可选:设置默认时区和 locale
Settings.defaultZone = 'Asia/Shanghai'
Settings.defaultLocale = 'zh'最小示例
import { DateTime } from 'luxon'
// 创建当前时间
const now = DateTime.now()
// 格式化
console.log(now.toFormat('yyyy-MM-dd HH:mm:ss')) // '2026-07-07 14:30:00'
// 日期计算
const tomorrow = now.plus({ days: 1 })
// 时区转换
const tokyo = now.setZone('Asia/Tokyo')
console.log(tokyo.toFormat('yyyy-MM-dd HH:mm')) // 东京时间
// 相对时间
console.log(now.minus({ hours: 3 }).toRelative()) // '3 小时前'
// 解析 ISO 字符串
const dt = DateTime.fromISO('2026-07-07T14:30:00+08:00')核心概念与架构
不可变 DateTime 对象
Luxon 的核心是 DateTime 类,所有操作返回新实例:
const dt = DateTime.now()
const later = dt.plus({ hours: 2 })
// dt 保持不变基于 Intl API
Luxon 将时区数据、国际化格式等委托给浏览器原生的 Intl API:
- 时区转换使用
Intl.DateTimeFormat - 本地化格式使用浏览器内建的 locale 数据
- 非格里高利日历系统(如伊斯兰历、佛历)也通过 Intl 支持
Zone 系统
Luxon 内置了灵活的 Zone 抽象:
FixedOffsetZone:固定偏移量(如UTC+8)IANAZone:IANA 时区名称(如Asia/Shanghai)SystemZone:系统本地时区(默认)InvalidZone:无效时区标识
核心对象体系
| 对象 | 用途 |
|---|---|
DateTime | 日期 + 时间 + 时区 |
Duration | 时间跨度(年、月、日、时、分、秒) |
Interval | 时间区间(起止时间) |
Info | 日历信息查询(月份名、工作日名等) |
Settings | 全局配置(时区、locale) |
核心特性
- 不可变设计:所有 DateTime 操作返回新实例
- 内置时区支持:基于 Intl API,无需额外数据文件
- Duration 系统:支持日历感知的 duration 运算(考虑闰年、月份天数)
- Interval 系统:时间区间操作,支持重叠检测、包含判断
- 完整的 I18n:利用浏览器 Intl 支持所有 locale
- 非格里高利日历:支持伊斯兰历、佛历、希伯来历等
- 丰富的解析/格式化:ISO 8601、HTTP、SQL、RFC 2822 等格式原生支持
- 链式 API:流畅的面向对象调用风格
- TypeScript 支持:完整的类型定义
- DST 安全:正确处理夏令时切换
生态图
核心模块
| 模块 | 功能 |
|---|---|
DateTime | 核心日期时间对象 |
Duration | 时间跨度运算 |
Interval | 时间区间 |
Info | 日历信息查询(月份名、工作日名等) |
Settings | 全局配置 |
第三方生态
- ts-luxon(v4.2.0):TypeScript 增强版本,更严格的类型定义
- luxon-ext:扩展功能
- angular-luxon:Angular 集成
- ember-luxon:Ember 集成
- luxon-adapter:与 Angular Material Date Adapter 集成
关键依赖
Luxon 核心零外部依赖。时区和国际化通过浏览器 Intl API 实现。在旧浏览器中需要 Intl polyfill。
适用场景
- 复杂时区处理:跨时区应用、全球化产品,Luxon 的内置时区支持是最完整的
- 国际化应用:多语言日期格式化、多日历系统(伊斯兰历、佛历等)
- 日历和排班系统:Interval 和 Duration 的日历感知运算适合复杂排班逻辑
- 数据分析与报表:时间区间聚合、按周/月/季统计
- 需要精确日期数学:Duration 支持"1 个月"这种日历感知的时间跨度
- 从 Moment.js 迁移(追求完整功能):Luxon 是 Moment.js 团队官方推荐的替代方案
- 服务器端日期处理:Node.js 环境下的时区转换和格式化
开发与工程化
项目构建
git clone https://github.com/moment/luxon.git
cd luxon
npm install
# 运行测试
npm test
# 构建
npm run build开发最佳实践
- 优先使用
fromISO解析:ISO 8601 是最安全的日期交换格式 - 显式指定时区:不要依赖系统本地时区,始终显式设置
setZone - 使用 Interval 处理范围:比手动比较两个 DateTime 更安全
- 利用 Duration 的日历感知:
Duration.fromObject({ months: 1 })会考虑月份实际天数
CI/CD 集成
# 测试 Luxon 相关功能
- run: npm test -- --grep "date"性能与安全
性能特点
- 解析性能:在四大日期库中解析速度最慢(但差异在微秒级)
- 内存占用:~53KB 包大小,比 Moment.js 小但远大于 Day.js
- 大量数据处理:Luxon 在海量日期计算场景下性能不及 Day.js 和原生 Date
性能优化建议
- 避免在紧密循环中频繁创建 DateTime 实例
- 对于简单格式化场景,可考虑使用原生
Intl.DateTimeFormat替代 - 使用
Settings.now可以 mock 当前时间(便于测试)
安全注意事项
- Luxon 纯计算库,不涉及网络请求
- 解析用户输入字符串时应检查
.isValid属性 - 在旧浏览器中需确保 Intl polyfill 可用
技术对比
| 特性 | Luxon | Day.js | date-fns | Moment.js |
|---|---|---|---|---|
| 包大小 | ~53KB | ~2KB | ~17.5KB | ~72KB |
| 不可变 | ✅ | ✅ | ✅ | ❌ |
| Tree-shaking | ✅ 部分 | ❌ | ✅ 完美 | ❌ |
| TypeScript | ✅ | ✅ | ✅ | ❌ |
| 时区 | ✅ 内置 | 插件 | @date-fns/tz | moment-timezone |
| I18n | ✅ Intl 驱动 | 插件 | locale 导入 | locale 导入 |
| Duration | ✅ 日历感知 | 插件 | 函数 | ✅ |
| Interval | ✅ | ❌ | 函数 | ❌ |
| API 风格 | 链式/OOP | 链式 | 纯函数 | 链式 |
| 学习曲线 | 中等 | 低 | 中等 | 低 |
| 维护状态 | ✅ 活跃 | ✅ 活跃 | ✅ 活跃 | ⚠️ 维护模式 |
何时选择 Luxon
- 需要强大、内置的时区处理能力
- 需要复杂的 Duration 和 Interval 运算
- 需要支持非格里高利日历系统
- 追求 Moment.js 团队官方推荐的迁移方案
- 偏好 OOP/链式 API 但不想承担 Moment.js 的体积和可变性问题
最佳实践
推荐模式
// ✅ 统一配置全局默认值
import { DateTime, Settings } from 'luxon'
Settings.defaultZone = 'Asia/Shanghai'
Settings.defaultLocale = 'zh'
// ✅ 使用 fromISO 解析所有日期字符串
const parseDate = (str) => DateTime.fromISO(str)
// ✅ 使用 Interval 处理日期范围
import { Interval } from 'luxon'
const interval = Interval.fromDateTimes(start, end)
console.log(interval.count('days')) // 区间天数
// ✅ 使用 Duration 进行日历感知运算
import { Duration } from 'luxon'
const oneMonthLater = dt.plus(Duration.fromObject({ months: 1 }))常见陷阱
- 包大小考虑:Luxon 53KB 的体积在移动端场景下不可忽视
- 旧浏览器 Intl 支持:Luxon 依赖 Intl API,IE11 和部分旧浏览器需要 polyfill
- Duration vs Interval 混淆:Duration 是"时间跨度",Interval 是"时间区间",使用场景不同
- setZone 不改变底层时间:
dt.setZone('Asia/Tokyo')是转换显示时区,不改变实际时间点 - 格式化 token 差异:Luxon 的格式化 token(
yyyy-MM-dd)与 Moment.js(YYYY-MM-DD)不同,注意区分
技术局限与边界
- 包体积较大:~53KB 虽小于 Moment.js,但远大于 Day.js(2KB)和 tree-shaken 后的 date-fns
- Tree-shaking 不完全:Luxon 的对象体系设计使得 tree-shaking 效果不如 date-fns 的纯函数设计
- 解析性能较低:在微基准测试中解析速度不及其他库(但实际应用中差异微小)
- API 与 Moment.js 不兼容:虽然由 Moment.js 开发者创建,但 API 完全不同,迁移需要重写
- Intl API 依赖:在 Intl 支持不完整的环境中(如旧版 Node.js)行为可能不一致
- Luxon 4.0 路线图不确定:GitHub 上提及 4.0 规划,但尚无明确发布时间表
- 社区规模较小:相比 date-fns 和 Day.js,Luxon 的社区规模和第三方生态较小
学习资源
- 官方文档:https://moment.github.io/luxon/
- GitHub 仓库:https://github.com/moment/luxon
- 官方 Demo:https://moment.github.io/luxon/demo/global.html
- Medium 教程:https://eraoftech.medium.com/use-luxon-like-a-pro-clean-reliable-date-time-in-javascript-aa4b5fbdb202
- Atomic Spin 对比文章:https://spin.atomicobject.com/which-javascript-datetime-library/
2026 年现状
当前版本
- v3.7.2(2025 年 7 月):最新稳定版,修复了 ES6 打包问题
- v3.7.0 新增了
Duration#toHuman的showZeros选项、Duration#removeZeros方法、DateTime#toRelative的rounding选项 - Luxon 4.0 在规划中,社区可参与讨论
社区活跃度
- npm 周下载量 600 万+
- GitHub Stars 14,000+
- 版本发布节奏积极,保持至少每 12 个月有新版本发布
- ts-luxon(TypeScript 增强版)保持活跃更新
发展趋势
- Luxon 在复杂时区和日历计算场景保持独特优势
- 作为 Moment.js 团队官方推荐的替代方案,具有品牌信任度
- 随着 Temporal API 浏览器原生支持的推进,Luxon 的内置时区优势可能会受到挑战,因为 Temporal 也将提供原生时区支持
- Luxon 4.0 预计会进一步优化体积和性能,可能更好地适配 Temporal 生态
- 在"功能完整性"维度上,Luxon 仍然是四大日期库中最强的选择