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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:24:53