You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置系统区域设置后DateFormat.jm()与DateFormat.Hm()输出一致,这是Dart intl包的Bug吗?

这不是Bug,是对DateFormat.jm()的理解偏差

首先明确:这不是intl包的bug,而是你对DateFormat.jm()的定位有点误解——它不是强制输出AM/PM格式,而是采用当前locale定义的「短时间格式」。

为什么会出现这种情况?

在en_GB(英国英语)区域设置里,系统默认的短时间格式就是24小时制(不带AM/PM标识),所以DateFormat.jm()会严格遵循这个locale的规则输出24小时制时间;而DateFormat.Hm()本身就是指定用24小时制的小时(H代表0-23的小时数)加分钟的格式,因此两者输出完全一致。

而默认的en_US(美国英语)locale中,短时间格式是12小时制带AM/PM,所以jm()会输出带AM/PM的格式,和Hm()的24小时制形成明显区别——这就是你省略findSystemLocale()时能得到预期结果的原因。

怎么实现「强制AM/PM格式」?

如果你需要不管当前locale是什么,都固定输出带AM/PM的12小时制时间,别用jm(),直接用自定义格式字符串:

import 'package:intl/intl.dart';
import 'package:intl/intl_standalone.dart';

void main() async {
  await findSystemLocale();
  final now = DateTime.now();
  
  // 强制12小时制+AM/PM
  final amPmFormatter = DateFormat('h:mm a');
  // 强制24小时制(和原来的Hm()效果一致)
  final twentyFourHourFormatter = DateFormat('H:mm');
  
  print("${Intl.defaultLocale} ${amPmFormatter.format(now)} ${twentyFourHourFormatter.format(now)}");
}

这里补充几个关键格式符的含义,方便你自定义:

  • h:12小时制的小时数(范围1-12)
  • H:24小时制的小时数(范围0-23)
  • a:AM/PM标识(会根据locale自动本地化,比如部分非英语locale会显示对应语言的上午/下午标识)

内容的提问来源于stack exchange,提问作者James Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:57:27