Flutter DateTime日期转换详解:从时间戳到格式化输出

Luna
Luna
发布时间:2026-10-15 | 7人浏览过
原创

在Flutter开发中,正确处理日期和时间是构建应用的基础环节。本文将深入解析Dart语言中DateTime类的高频使用场景,包括时间戳互转、字符串解析、基于Duration的时间跨度计算、时间比较运算以及局部属性提取,提供可直接运行的代码片段以解决实际问题。

结果与目标

掌握Flutter/Dart中处理日期时间的标准库方法,确保在业务逻辑中能准确完成时间的格式转换、区间计算与前后对比,避免时区与精度带来的常见Bug。

准备条件

  1. 环境配置:已安装Dart SDK及Flutter框架的本地开发环境。
  2. 基础语法:了解Dart的基本数据类型(如String, int, double)及变量声明方式。

真实操作顺序

第1步:获取当前时间并转为时间戳

目的:获取当前系统时间的毫秒级Unix时间戳,常用于网络请求参数传输。

  • 入口:DateTime.now()
  • 动作:调用 millisecondsSinceEpoch 属性。
  • 注意:Dart中默认返回的是13位毫秒时间戳,需注意与部分Java/Android原生API(通常为10位秒级时间戳)的单位差异。
var now = DateTime.now();
print(now.millisecondsSinceEpoch); // 输出例如: 1670000000000

第2步:将时间戳还原为DateTime对象

目的:接收外部传入的时间戳数据,将其转换为可读的日期对象以便展示或计算。

  • 入口:DateTime.fromMillisecondsSinceEpoch(int)
  • 参数:传入毫秒级时间戳整数。
  • 完成状态:获得一个包含具体年月日时分秒的DateTime实例。
var timestamp = 1670000000000;
var dateObj = DateTime.fromMillisecondsSinceEpoch(timestamp);
print(dateObj);

第3步:从字符串解析为DateTime

目的:处理用户输入或API返回的标准日期字符串。

  • 入口:DateTime.parse(String)
  • 动作:支持ISO 8601格式,如 'yyyy-MM-dd' 或 'yyyy-MM-dd HH:mm:ss'。
  • 注意:非标准格式的字符串需先使用intl包的 DateFormat 类进行预处理,否则可能抛出异常。
// 解析仅含日期的字符串
var dateOnly = DateTime.parse('2019-11-08');

// 解析包含时分秒的字符串
var dateTimeFull = DateTime.parse('2019-11-08 12:30:05');

第4步:创建指定时间的DateTime对象

目的:固定某个特定时间点,用于测试或业务规则校验。

  • 入口:DateTime(year, month, day, ...)
  • 参数:年份(必填)、月份(1-12)、日期(1-31),后续可选小时、分、秒、毫秒。
var fixedDate = DateTime(2020, 10, 10);
print(fixedDate); // 输出: 2020-10-10 00:00:00.000

第5步:时间跨度计算(Duration的使用)

目的:实现日期的加减法,如“5天后”或“3小时前”。

  • 入口:Duration(days:, hours:, minutes:, seconds:)
  • 动作:使用 add(Duration) 增加时间,或使用 subtract(Duration) 减少时间。
  • 重要参数:Duration构造函数支持days, hours, minutes, seconds, milliseconds等键值对。
var today = DateTime.now();

// 加5天
var futureDate = today.add(Duration(days: 5));
print('未来日期: $futureDate');

// 减5天
var pastDate = today.subtract(Duration(days: 5));
print('过去日期: $pastDate');

第6步:时间点的比较

目的:判断两个时间点的前后关系,常用于过期验证、排序等场景。

  • 入口:isBefore(), isAfter(), isAtSameMomentAs()
  • 动作:直接调用方法并传入另一个DateTime对象。
var target = DateTime.parse("2019-06-20 15:32:41");
var now = DateTime.now();

if (now.isBefore(target)) {
  print('目标时间在现在之后');
} else if (now.isAfter(target)) {
  print('目标时间在现在之前');
}

第7步:获取时间差的具体数值

目的:计算两个时间点之间具体的持续时间长度,可用于展示剩余天数或耗时统计。

  • 入口:difference(DateTime)
  • 结果:返回一个 Duration 对象,可通过其属性获取总毫秒数或分解后的天时秒。
var start = DateTime(2019, 6, 20, 17, 30, 20);
var end = DateTime(2019, 7, 21, 0, 0, 0);

Duration diff = end.difference(start);
print('时间差: $diff'); 
// 输出类似: 726:29:39.800000 (表示726小时29分...)

第8步:提取时间的局部属性与时区信息

目的:单独获取年、月、日或查看本地时区设置。

  • 入口:直接访问属性,如 .year, .month, .timeZoneName.
  • 注意:timeZoneOffset 返回的是Duration类型,表示相对于UTC的偏移量。
var now = DateTime.now();

print('年份: ${now.year}');
print('月份: ${now.month}');
print('本地时区名: ${now.timeZoneName}');
print('UTC偏移量: ${now.timeZoneOffset}'); // 例如: -08:00:00.000000

原文有依据的排错

  1. 时间戳单位混淆:JavaScript和Dart通常使用毫秒(13位),而Java/C#/Android原生SDK常使用秒(10位)。在网络交互中务必确认两端约定的单位,必要时乘以或除以1000进行转换。
  2. 时区问题:DateTime.now() 默认返回的是本地时区的时间。如果需要协调世界时(UTC),应使用 DateTime.utcNow()(若版本支持)或手动调用 .toUtc() 进行转换,以避免跨时区服务器存储时的显示错误。
  3. 字符串解析失败:如果 DateTime.parse 报错,请检查字符串格式是否符合ISO 8601标准。对于复杂格式,建议使用第三方库 intl 中的 DateFormat 工具类。

简要总结

通过上述步骤,可以覆盖Flutter开发中90%以上的日期处理需求。核心在于理解 DateTime 对象的不可变性(每次操作返回新对象)以及 Duration 作为时间跨度的中间件角色。以上就是Flutter DateTime日期转换的详细使用教程,更多关于Flutter开发技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表