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

如何在Dart中将SQL查询返回的毫秒时间戳转为DateTime对象

高效转换SQL查询结果为Dart DateTime对象

优化查询与批量转换(最直接高效)

首先修正你的查询写法,永远用参数化查询避免SQL注入,然后通过map批量转换结果——这是线性遍历的O(n)操作,已是最优的转换方式:

// 参数化查询更安全,性能也更稳定
final queryResults = await db.rawQuery(
  '''SELECT dateTime FROM days WHERE dateTime BETWEEN ? AND ?''',
  [start.millisecondsSinceEpoch, end.millisecondsSinceEpoch]
);

// 转换为纯DateTime列表(如果只需要时间值)
final dateTimeList = queryResults
    .map((row) => DateTime.fromMillisecondsSinceEpoch(row['dateTime'] as int))
    .toList();

// 或者保留原映射结构,替换dateTime字段为DateTime对象
final mappedResults = queryResults
    .map((row) => {...row, 'dateTime': DateTime.fromMillisecondsSinceEpoch(row['dateTime'] as int)})
    .toList();

封装工具方法提升复用性

如果经常需要做这类转换,可以封装扩展方法或工具函数,让代码更简洁:

扩展Map的转换方法

extension DateTimeConverter on Map<String, dynamic> {
  DateTime get toDateTime => DateTime.fromMillisecondsSinceEpoch(this['dateTime'] as int);
}

// 使用示例
final dateTimeList = queryResults.map((row) => row.toDateTime).toList();

通用转换函数

DateTime msToDateTime(int milliseconds) => DateTime.fromMillisecondsSinceEpoch(milliseconds);

// 使用示例
final dateTimeList = queryResults.map((row) => msToDateTime(row['dateTime'] as int)).toList();

注意事项

  • 必须加上类型断言as int,避免数据库返回dynamic类型导致运行时错误;
  • 无需追求“零遍历”转换——每一行的毫秒数都需要单独解析为DateTime,线性遍历是不可避免的,上述方法已是最小开销的实现;
  • 如果使用ORM框架(如Moor、Isar),可以配置自定义类型转换器,让框架自动完成转换,无需手动处理。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:30:37