配置系统区域设置后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
相关产品推荐
相关产品推荐

