Flutter中如何格式化时间字符串并与当前时间进行比较
解决Flutter中纯时间字符串解析与比较问题
错误原因
DateTime.parse()仅支持解析符合ISO 8601标准的完整日期时间字符串(如2024-05-20T08:00:00),直接传入08:00这类纯时分字符串会触发格式无效错误。- 原代码存在变量重复定义问题(
closeTime和openTime被重复赋值),会导致逻辑混乱。
解决方案
以下提供两种可行的实现方式,均需确保已导入intl包(在pubspec.yaml中添加intl: ^0.18.1依赖后执行flutter pub get)。
方法一:拼接当前日期后解析
将纯时间字符串与当前日期拼接为完整格式,再进行解析和比较:
import 'package:intl/intl.dart'; void checkBusinessStatus() { final String openTimeStr = '08:00'; final String closeTimeStr = '20:00'; final DateTime now = DateTime.now(); // 获取当前日期字符串,与时间拼接成可解析的格式 final String todayDate = DateFormat('yyyy-MM-dd').format(now); final DateTime openTime = DateTime.parse('$todayDate $openTimeStr'); final DateTime closeTime = DateTime.parse('$todayDate $closeTimeStr'); bool isOpened = true; // 判断当前时间是否在营业区间外 if (now.isBefore(openTime) || now.isAfter(closeTime)) { isOpened = false; } print(isOpened ? "营业中" : "已打烊"); }
方法二:提取时分数值直接比较
通过DateFormat解析纯时间字符串,提取小时和分钟的数值进行比较,适合跨天营业时间场景(如22:00到次日06:00):
import 'package:intl/intl.dart'; void checkBusinessStatus() { final String openTimeStr = '08:00'; final String closeTimeStr = '20:00'; final DateTime now = DateTime.now(); final DateFormat timeFormatter = DateFormat('HH:mm'); // 解析时间字符串(日期部分为默认值,不影响时分提取) final DateTime openTime = timeFormatter.parse(openTimeStr); final DateTime closeTime = timeFormatter.parse(closeTimeStr); // 将时间转换为当日总分钟数,方便比较 final int nowTotalMinutes = now.hour * 60 + now.minute; final int openTotalMinutes = openTime.hour * 60 + openTime.minute; final int closeTotalMinutes = closeTime.hour * 60 + closeTime.minute; bool isOpened = nowTotalMinutes >= openTotalMinutes && nowTotalMinutes <= closeTotalMinutes; print(isOpened ? "营业中" : "已打烊"); }
内容的提问来源于stack exchange,提问作者Jmocke
相关产品推荐
相关产品推荐

