You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何格式化时间字符串并与当前时间进行比较

解决Flutter中纯时间字符串解析与比较问题

错误原因

  1. DateTime.parse() 仅支持解析符合ISO 8601标准的完整日期时间字符串(如2024-05-20T08:00:00),直接传入08:00这类纯时分字符串会触发格式无效错误。
  2. 原代码存在变量重复定义问题(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:13:16