Flutter中如何将24小时制TimeOfDay转换为12小时制
问题分析与解决方案
你的代码问题出在用12小时制格式解析24小时制的小时值:DateFormat("hh:mm")是12小时制的解析规则,当传入超过12的小时数(比如13、14)时,会被错误转换为12小时制的数值,导致后续格式化出的AM/PM标识异常甚至缺失。
修正方案一:通过DateTime正确转换
直接基于当前日期创建包含选择时间的DateTime实例,再用12小时制格式格式化:
if (time != null) { setState(() { // 用当前年月日+选择的时分,构建正确的24小时制DateTime DateTime selectedTime = DateTime( DateTime.now().year, DateTime.now().month, DateTime.now().day, time.hour, time.minute, ); // 用12小时制带AM/PM的格式格式化 var dateFormat = DateFormat("h:mm a"); controller.text = dateFormat.format(selectedTime); }); }
修正方案二:直接通过TimeOfDay计算AM/PM
无需依赖DateTime,直接通过hour值判断时段:
if (time != null) { setState(() { String period = time.hour >= 12 ? 'PM' : 'AM'; int hour12 = time.hour % 12; // 特殊处理0点(转为12AM)和12点(保持12PM) hour12 = hour12 == 0 ? 12 : hour12; // 分钟补零,保证格式统一(比如5分显示为05) String minuteStr = time.minute.toString().padLeft(2, '0'); controller.text = '$hour12:$minuteStr $period'; }); }
原代码问题详解
当你用time.hour.toString() + ":" + time.minute.toString()拼接成字符串,再用DateFormat("hh:mm")解析时:
- 若选择13点,
hh会把13解析为1(12小时制的1点),生成的DateTime是凌晨1点,格式化后显示AM,和实际选择的下午1点不符; - 若选择0点(午夜),解析后是12点AM,部分场景下可能因解析逻辑的隐性错误导致AM标识缺失;
- 这种解析方式完全违背了
showTimePicker返回的24小时制TimeOfDay的设计逻辑,必然出现格式转换异常。
内容的提问来源于stack exchange,提问作者Deva
相关产品推荐
相关产品推荐

