Java 8+ 的 java.time API 通过 ZoneId 处理时区、Locale 控制本地化格式,需配合使用;ofLocalizedDateTime() 动态适配各国习惯,自定义格式须显式传入 Locale,农历等需借助 ThreeTen-Extra 等扩展库。

Java 8+ 的 java.time API 本身不直接“处理”各国时间格式化差异,而是提供标准化、可配置的机制——关键在于用对类、传对 Locale,并理解时区(ZoneId)与本地化(Locale)的分工。
区分时区和语言地区:ZoneId 管“几点”,Locale 管“怎么写”
很多人混淆这两者。比如中国用户看到“2025年4月5日 14:30”,德国用户看到“05.04.2025, 14:30”,差别不在时区(都可用 Asia/Shanghai),而在显示习惯——这由 Locale 决定。
-
ZoneId:决定时间点对应的本地时刻(如东八区 vs 中欧时间) -
Locale:决定日期/时间字段顺序、分隔符、星期/月份名称、数字样式(如阿拉伯数字 vs 汉字数字) - 格式化时必须同时指定二者:先用
ZonedDateTime或LocalDateTime+ZoneId得到带时区的时间,再用DateTimeFormatter.ofLocalized…(…, locale)渲染
用 ofLocalizedDateTime() 动态适配常见格式
不用硬编码模式字符串,让 Java 根据 Locale 自动选择符合当地习惯的格式:
-
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.CHINA)→ “2025年4月5日 上午2:30” -
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.GERMAN)→ “05.04.2025, 14:30:45” -
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(new Locale("ja", "JP"))→ “2025年4月5日土曜日 14時30分45秒 JST” - 支持
SHORT/MEDIUM/LONG/FULL四级粒度,兼顾简洁与完整
自定义格式时显式传入 Locale,避免默认陷阱
用 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") 会忽略本地化,始终输出英文数字和连字符。要支持多语言,必须:
- 用
DateTimeFormatterBuilder构建可本地化的模式,例如:new DateTimeFormatterBuilder().appendPattern("yyyy年MM月dd日").appendLocalized(FormatStyle.SHORT).toFormatter(Locale.CHINA) - 或对固定模式,强制绑定
Locale:DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm", Locale.FRANCE)→ 法国用户看到 “05/04/2025 14:30” - 切记:
Locale.getDefault()不可靠,Web 应用应从请求头(Accept-Language)或用户设置中获取真实Locale
处理农历、阴阳历等非公历系统需额外库
标准 java.time 只支持 ISO 日历(公历)。中国农历、日本和历、伊斯兰历等需扩展:
- 使用
java.time.chrono包中的MinguoChronology(中华民国纪年)、JapaneseChronology(日本年号)等,但农历(ChineseCalendar)未内置 - 生产环境推荐 ThreeTen-Extra 或 libcalendula,它们提供
ChineseDate类和农历格式化器 - 示例(ThreeTen-Extra):
ChineseDate.now(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy年MM月dd日", Locale.CHINA))→ “二〇二五年三月初七”
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











