Dart中如何将字符串时间解析为仅含时分秒的DateTime?
解决Dart中解析时间字符串时去除默认日期的问题
Dart里的DateTime类型必然包含日期部分,不存在只保留时间的纯时间DateTime对象。你现在看到的1970-01-01是Unix纪元默认日期,属于解析时的正常行为。如果只是后续计算需要用到时间部分,有两种可行的处理方式:
方式1:忽略日期,直接用时间部分计算
如果你的计算只涉及小时、分钟、秒的差值或操作,完全可以无视日期部分,直接使用解析后的DateTime的hour、minute、second属性来处理。比如计算两个时间的间隔:
import 'package:intl/intl.dart'; void main() { String timeStr1 = "3:38 PM"; String timeStr2 = "5:15 PM"; DateTime time1 = DateFormat("h:mm a").parse(timeStr1); DateTime time2 = DateFormat("h:mm a").parse(timeStr2); // 计算时间差,自动忽略日期(因为日期都是1970-01-01) Duration difference = time2.difference(time1); print("时间差:${difference.inHours}小时${difference.inMinutes % 60}分钟"); }
方式2:替换日期为指定值(比如当前日期)
如果需要DateTime对象的日期部分是特定值(比如今天),可以在解析后重新构造DateTime,保留时间部分:
import 'package:intl/intl.dart'; void main() { String timeStr = "3:38 PM"; try { DateTime parsedTime = DateFormat("h:mm a").parse(timeStr); // 获取当前日期 DateTime now = DateTime.now(); // 构造新的DateTime,用当前日期替换默认的1970-01-01,保留时间 DateTime timeWithCurrentDate = DateTime( now.year, now.month, now.day, parsedTime.hour, parsedTime.minute, parsedTime.second, parsedTime.millisecond, parsedTime.microsecond, ); print(timeWithCurrentDate); // 输出类似:2024-05-20 15:38:00.000 // 如果只是想格式化输出不带日期的时间,直接用DateFormat即可 print(DateFormat("HH:mm:ss.SSS").format(parsedTime)); // 输出:15:38:00.000 } catch (e) { print("Invalid time format"); } }
另外注意,你原来的代码里用了HH:mm a作为解析格式,HH是24小时制,而你的输入是12小时制的3:38 PM,应该用h:mm a来解析更准确,避免解析错误。
内容的提问来源于stack exchange,提问作者Auvee
相关产品推荐
相关产品推荐

