Luxon logo

Luxon

由 Moment.js 核心贡献者打造的现代日期时间处理库,基于浏览器原生 Intl API 构建。

日期时间JavaScriptIntl 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/
GitHubhttps://github.com/moment/luxon
LicenseMIT
最新版本v3.7.2(2025 年 7 月)
主要维护者Moment.js 团队(Isaac Cambron 创建)
npm 周下载量~600 万+
GitHub Stars14,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(&#123; months: 1 &#125;) 会考虑月份实际天数

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 可用

技术对比

特性LuxonDay.jsdate-fnsMoment.js
包大小~53KB~2KB~17.5KB~72KB
不可变
Tree-shaking✅ 部分✅ 完美
TypeScript
时区✅ 内置插件@date-fns/tzmoment-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 的社区规模和第三方生态较小

学习资源

2026 年现状

当前版本

  • v3.7.2(2025 年 7 月):最新稳定版,修复了 ES6 打包问题
  • v3.7.0 新增了 Duration#toHumanshowZeros 选项、Duration#removeZeros 方法、DateTime#toRelativerounding 选项
  • 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 仍然是四大日期库中最强的选择