如何将仅含时分的字符串转换为带GMT的DateTime格式
问题描述
需要生成的目标时间格式为:
"2023-01-09T10:45:00.000+05:30"
当前仅能获取到类似 "10:00 AM" 的时间字符串,尝试了以下代码但无法正常运行:
var GMTdateFormat = DateFormat('yyyy-MM-ddHH:mm:ss.000+05:30').format( DateTime.parse( (state as SlotRequestPopUpDataLoadedState) .slotStartTimingList .where((element) => element.isSelected == true) .map((e) => e.name) .toString(), ).toUtc(), );
解决方法
你的代码存在两个核心问题:一是DateTime.parse无法直接解析仅含12小时制时分的字符串;二是DateFormat的格式字符串缺少必要分隔符,时区处理逻辑错误。以下是修复方案:
1. 正确解析12小时制时间字符串
使用intl包的DateFormat.jm()来解析"10:00 AM"这类格式,同时注意获取选中项时,map().toString()会返回类似(10:00 AM)的无效字符串,应该用firstWhere直接获取选中项的时间字符串:
// 获取选中的时间字符串 String selectedTime = (state as SlotRequestPopUpDataLoadedState) .slotStartTimingList .firstWhere((item) => item.isSelected) .name; // 解析12小时制时间 DateFormat timeParser = DateFormat.jm(); DateTime parsedTime = timeParser.parse(selectedTime);
2. 组合日期与时间
解析后的parsedTime会默认使用当前日期,如果你需要指定固定日期(比如示例中的2023-01-09),可以手动替换日期部分:
// 替换为你需要的目标日期 DateTime targetDate = DateTime(2023, 1, 9); DateTime combinedDateTime = DateTime( targetDate.year, targetDate.month, targetDate.day, parsedTime.hour, parsedTime.minute, 0, // 秒设置为0 );
3. 格式化为目标时区格式
目标格式包含T分隔符和+05:30时区偏移,需要使用正确的格式字符串:
DateFormat targetFormatter = DateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+05:30'"); String finalTimeStr = targetFormatter.format(combinedDateTime);
完整代码示例
import 'package:intl/intl.dart'; // ... 你的状态逻辑代码 String selectedTime = (state as SlotRequestPopUpDataLoadedState) .slotStartTimingList .firstWhere((item) => item.isSelected) .name; // 解析时间 DateFormat timeParser = DateFormat.jm(); DateTime parsedTime = timeParser.parse(selectedTime); // 组合指定日期和解析出的时间 DateTime targetDate = DateTime(2023, 1, 9); // 可替换为DateTime.now()使用当前日期 DateTime combinedDateTime = DateTime( targetDate.year, targetDate.month, targetDate.day, parsedTime.hour, parsedTime.minute, 0, ); // 生成目标格式字符串 DateFormat targetFormatter = DateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+05:30'"); String finalTime = targetFormatter.format(combinedDateTime); // 输出示例:"2023-01-09T10:00:00.000+05:30"
内容的提问来源于stack exchange,提问作者Srasti Verma
相关产品推荐
相关产品推荐

