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

Flutter中使用jsonSerializable将DateTime转换为Timestamp

在Flutter中让json_serializable将DateTime转为Timestamp而非字符串

默认情况下,json_serializable会把DateTime类型序列化为字符串。要改成转为Timestamp(以Firebase的Timestamp为例),可以通过自定义JsonConverter实现:

1. 确保依赖齐全

在pubspec.yaml中添加必要依赖:

dependencies:
  json_annotation: ^4.8.1
  cloud_firestore: ^4.14.0 # 若使用Firebase Timestamp

dev_dependencies:
  json_serializable: ^6.7.1
  build_runner: ^2.4.6

2. 自定义Timestamp转换器

创建一个转换器类,处理DateTime和Timestamp之间的双向转换:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:json_annotation/json_annotation.dart';

class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
  const TimestampConverter();

  @override
  DateTime fromJson(Timestamp timestamp) => timestamp.toDate();

  @override
  Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}

3. 在模型类中应用转换器

修改你的Task类,添加序列化注解并应用转换器:

import 'package:json_annotation/json_annotation.dart';

part 'task.g.dart';

// 类级别应用转换器,所有DateTime字段都会使用该规则
@JsonSerializable()
@TimestampConverter()
class Task {
  final DateTime dateTime;
  final String taskName;

  Task({
    required this.dateTime,
    required this.taskName,
  });

  // 自动生成的序列化/反序列化方法
  factory Task.fromJson(Map<String, dynamic> json) => _$TaskFromJson(json);
  Map<String, dynamic> toJson() => _$TaskToJson(json);
}

如果只想给单个DateTime字段应用转换,也可以直接在字段上标注:

@JsonSerializable()
class Task {
  @TimestampConverter() // 仅该字段使用转换器
  final DateTime dateTime;
  final String taskName;

  // ... 构造方法和序列化方法
}

4. 生成序列化代码

执行以下命令生成对应的.g文件:

flutter pub run build_runner build

这样处理后,调用toJson()时dateTime会被转为Timestamp对象,而反序列化时Timestamp会转回DateTime,不再是默认的字符串格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:12:35