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

如何将DateTime实例正确格式化并编码为JSON格式

Dart DateTime类型JSON序列化方案

问题根因

JSON标准中没有原生的日期时间类型,直接将DateTime实例放入待序列化的Map中,序列化工具无法识别该非基础类型,因此会运行失败。你编写的代码核心问题就是没有对DateTime做类型转换:

DateTime birthdate;
Map<String, dynamic> toJson() => {
  'birthDate': birthdate,
};

可直接使用的修复方案

  • 方案1:转ISO8601标准字符串(优先推荐)
    该格式跨语言兼容性强、自带时区信息、精度到微秒,适合绝大多数业务场景,修复后代码如下:

    DateTime birthdate;
    Map<String, dynamic> toJson() => {
      'birthDate': birthdate.toIso8601String(),
    };
    

    解码时调用DateTime.parse(json['birthDate'])即可还原为DateTime实例,和你已经掌握的解码逻辑完全匹配。

  • 方案2:转数字时间戳(适合数值计算场景)
    如果需要频繁对日期做大小对比、或者要压缩传输体积,可以选择转成毫秒/微秒级时间戳:

    DateTime birthdate;
    Map<String, dynamic> toJson() => {
      // 毫秒级时间戳,需要更高精度可替换为microsecondsSinceEpoch
      'birthDate': birthdate.millisecondsSinceEpoch,
    };
    

    对应解码方法为DateTime.fromMillisecondsSinceEpoch(json['birthDate'])。

自动化序列化适配提示

如果项目使用json_serializable这类自动生成序列化代码的库,无需手动编写toJson转换逻辑,只需在字段上添加注解指定转换方法即可:

import 'package:json_annotation/json_annotation.dart';

@JsonSerializable()
class User {
  @JsonKey(
    fromJson: DateTime.parse,
    toJson: _dateTimeToIso,
  )
  DateTime birthdate;

  static String _dateTimeToIso(DateTime date) => date.toIso8601String();

  // 其余生成代码省略
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:15:02