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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:54:05