如何在Luxon中实现Moment.js里LLL格式的时间格式化?
从Moment.js迁移到Luxon实现相同时间格式化效果
问题场景
原本使用Moment.js实现以下时间格式化:
moment().format('LLL') // 输出示例:June 9 2014 9:32 PM moment().format('D MMM YYYY[,] HH[:]mm z')
切换到Luxon后,发现luxon.DateTime.toFormat('LLL')仅返回本地化月份缩写,无法得到Moment中LLL对应的完整日期时间格式,同时需要验证自定义格式的转换正确性。
解决方案
1. 替代Moment.js的LLL格式
Moment的LLL是本地化中等日期时间格式,Luxon不支持直接用toFormat('LLL')实现,需要使用toLocaleString并指定对应格式:
方法一:使用预定义本地化格式
Luxon提供了预定义的格式常量,DATETIME_MED完全匹配MomentLLL的效果:
luxon.DateTime.now().toLocaleString(luxon.DateTime.DATETIME_MED) // 输出示例:June 9, 2014 9:32 PM(根据当前本地化设置,部分地区自动省略逗号)
方法二:自定义本地化选项
如果需要严格匹配无逗号的格式(如June 9 2014 9:32 PM),可以手动指定格式选项:
luxon.DateTime.now().toLocaleString({ month: 'long', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric', formatMatcher: 'basic' // 避免自动添加分隔符 })
2. 自定义格式D MMM YYYY[,] HH[:]mm z的转换
Luxon的toFormat令牌与Moment大部分兼容,只需调整少量差异:
- Moment的
D(月份日)对应Luxon的d - Moment的
YYYY(4位年)对应Luxon的yyyy
最终代码:
// 本地时区格式 luxon.DateTime.now().toFormat('d MMM yyyy[,] HH[:]mm z') // 输出示例:9 Jun 2024 14:32 CST // UTC时区格式 luxon.DateTime.utc().toFormat('d MMM yyyy[,] HH[:]mm z') // 输出示例:9 Jun 2024 06:32 UTC
内容的提问来源于stack exchange,提问作者GCT
相关产品推荐
相关产品推荐

