使用day.dart格式化日期时12小时显示为0的问题及选型咨询
Day.dart日期格式化显示0:00 AM而非12:00 AM的问题解决
问题原因与修复方案
你遇到的问题大概率是未正确配置本地化导致的。day.dart的h格式符(12小时制)需要依赖本地化配置来处理午夜/正午的12小时转换,默认状态下可能没有启用这个逻辑,才会输出0:00 AM而非预期的12:00 AM。
修复步骤:
- 先确认已引入对应本地化包,在
pubspec.yaml中确保依赖完整 - 初始化Day.dart时设置本地化,示例代码:
import 'package:day/day.dart'; import 'package:day/locale/en_us.dart'; void main() { Day.setLocale(enUsLocale); } - 如果配置后还是有问题,尝试替换格式串为
hh:mm A,hh是带前导零的12小时制格式符,测试是否能输出12:00 AM
要是以上操作都无效,那大概率是库的bug,建议去项目仓库搜索已有issues,或者提交新问题反馈。
Day.dart使用建议
- 初始化时务必设置正确的本地化,很多格式化、时区相关问题都源于此
- 记清楚常用格式符的区别:
h: 12小时制(1-12,无前置零)hh: 12小时制(01-12,有前置零)H: 24小时制(0-23)HH: 24小时制(00-23)
- 复杂日期处理优先用库内置方法,别自己拼接字符串,减少出错
原生DateTime替代方案
不想依赖第三方库的话,可以用Dart的intl包实现需求,原生逻辑对12小时制的午夜/正午处理更稳定:
import 'package:intl/intl.dart'; void main() { final midnight = DateTime(2024, 1, 1, 0, 0); final formatted = DateFormat('h:mm a').format(midnight); print(formatted); // 输出12:00 AM }
注意这里用小写a表示AM/PM标识,intl包的h格式符会自动将0点转换为12点。
另外,原生DateTime的小技巧:
- 处理时区问题可以用
DateTime.utc或结合intl的时区支持 - 自定义格式化前,先核对
intl的格式符文档,避免用错
内容的提问来源于stack exchange,提问作者Eric Russell
相关产品推荐
相关产品推荐

