Flutter中Moor数据库long类型转DateTime或Date的类型转换器实现方法
Moor long时间戳转DateTime/Date类型转换器实现方案
API返回的long类型在Dart中对应int类型,继承Moor的TypeConverter自定义转换逻辑即可实现需求。
1. 实现long转DateTime转换器
import 'package:moor/moor.dart'; // 适配毫秒级时间戳,若long为微秒级,将代码中milliseconds相关方法替换为microseconds即可 class LongToDateTimeConverter extends TypeConverter<DateTime, int> { const LongToDateTimeConverter(); @override DateTime? mapToDart(int? fromDb) { if (fromDb == null) return null; return DateTime.fromMillisecondsSinceEpoch(fromDb); } @override int? mapToSql(DateTime? value) { if (value == null) return null; return value.millisecondsSinceEpoch; } }
列定义使用方式
在对应列上添加@UseConverter注解即可:
class Orders extends Table { IntColumn get id => integer().autoIncrement()(); @UseConverter(LongToDateTimeConverter()) DateTimeColumn get payTime => dateTime()(); }
2. 实现long转仅日期类型转换器
如果不需要时间部分,仅保留年月日,使用如下转换器:
import 'package:moor/moor.dart'; class LongToDateConverter extends TypeConverter<DateTime, int> { const LongToDateConverter(); @override DateTime? mapToDart(int? fromDb) { if (fromDb == null) return null; final fullTime = DateTime.fromMillisecondsSinceEpoch(fromDb); // 清除时间部分,仅保留年月日 return DateTime(fullTime.year, fullTime.month, fullTime.day); } @override int? mapToSql(DateTime? value) { if (value == null) return null; final dateOnly = DateTime(value.year, value.month, value.day); return dateOnly.millisecondsSinceEpoch; } }
3. 额外说明
- 若需要所有对应类型的列都自动应用转换,可在数据库初始化时全局注册转换器,无需逐个列加注解:
final database = MyDatabase( // 你的数据库连接配置 QueryExecutor(/*...*/), setup: (db) { db.registerTypeConverter(const LongToDateTimeConverter()); }, );
- 不需要做数据库迁移:转换器仅做Dart层和存储层的类型映射,数据库底层存储的仍为int类型,存量表可直接接入使用。
内容的提问来源于stack exchange,提问作者sina .s
相关产品推荐
相关产品推荐

