Flutter倒计时器24小时制AM/PM识别错误导致剩余时间偏差如何解决
问题原因
- 目标时间解析逻辑错误:你当前的代码没有判断目标时间是否已在当日过期,且如果
wakeUpTime是带AM/PM的12小时制格式,直接用DateTime.parse无法正确识别AM/PM标识,会把上午10点错误解析为22点,导致计算出来的剩余时间少了12小时。 - 剩余时间格式化逻辑错误:
DateFormat是用于格式化日历时间的工具,本身带有时区偏移属性,且hh为12小时制格式化规则,用来格式化倒计时时长Duration类型会出现数值偏差。
修复方案
第一步:修正目标时间计算逻辑
根据你的wakeUpTime格式选择对应解析方式,同时增加当日目标时间过期自动顺延到次日的逻辑:
如果wakeUpTime是带AM/PM的12小时制字符串(如10:00 AM)
// 先用支持AM/PM的格式解析时间,获取24小时制的时分数值 DateFormat inputFormat = DateFormat("hh:mm a"); DateTime tempTime = inputFormat.parse(wakeUpTime); int targetHour = tempTime.hour; int targetMinute = tempTime.minute; DateTime now = DateTime.now(); // 构造当日目标时间 DateTime targetDateTime = DateTime(now.year, now.month, now.day, targetHour, targetMinute); // 若当日目标时间已过,自动顺延到次日 if (targetDateTime.isBefore(now)) { targetDateTime = targetDateTime.add(const Duration(days: 1)); } int estimatedTimeLeft = targetDateTime.millisecondsSinceEpoch;
如果wakeUpTime是24小时制的时分字符串(如10:00)
// 拆分时分数值 List<String> timeParts = wakeUpTime.split(':'); int targetHour = int.parse(timeParts[0]); int targetMinute = int.parse(timeParts[1]); DateTime now = DateTime.now(); DateTime targetDateTime = DateTime(now.year, now.month, now.day, targetHour, targetMinute); if (targetDateTime.isBefore(now)) { targetDateTime = targetDateTime.add(const Duration(days: 1)); } int estimatedTimeLeft = targetDateTime.millisecondsSinceEpoch;
第二步:修正剩余时间格式化逻辑
手动实现Duration格式化,避免时区和制式问题:
StreamBuilder( stream: Stream.periodic(const Duration(seconds: 1), (i) => i), builder: (BuildContext context, AsyncSnapshot<int> snapshot) { int timeNow = DateTime.now().millisecondsSinceEpoch; Duration remaining = Duration(milliseconds: estimatedTimeLeft - timeNow); // 补零格式化工具函数 String twoDigits(int n) => n.toString().padLeft(2, '0'); String hours = twoDigits(remaining.inHours); String minutes = twoDigits(remaining.inMinutes.remainder(60)); String seconds = twoDigits(remaining.inSeconds.remainder(60)); String dateString = '$hours:$minutes:$seconds'; return Container( child: Text(dateString), ); } );
内容的提问来源于stack exchange,提问作者GrandMagus
相关产品推荐
相关产品推荐

