Skip to main content

时间类型的选取

huhxAbout 1 min

Java中提供的时间类型可谓五花八门,从最开始的Date类型,再后面引入LocalDateLocalDateTime这些类型,再有ZonedDateTimeOffsetDateTime等等粉墨登场,半路还杀出个Instant。乱花渐欲迷人眼,开发多了选择,却纠结于选择。今天,我们就来看看这些百花争艳的时间类型中,谁能够在项目中取得宠爱。

起始

后端

数据库的时间字段:

birthday       date,
createTime     timestamp(0) not null

对应的java对象的Entity的类型

  private java.sql.Date birthday;

  private java.util.Date createTime;

一个是不包含时分秒,一个包含时分秒。

而序列化和反序列化,Springboot的项目中默认使用的是jackson作为序列化框架。其中对于Date的这两种类型,其实是序列化成时间戳的

  • input
"birthday": 1586864000
"createTime": 1586864932
  • output
"birthday": 1586864000
"createTime": 1586864932

移动端

上述的服务器端,对于Date类型的时间。input和output都是时间戳,也就是long类型。
所以在移动端接收和发送时间类型,需要做些操作。

flutter中的User作为例子,

DateTime? birthday,
required DateTime createTime,

定义的是DateTime类型,其中的fromMap和toJson需要作DateTimeint类型的转换。于是使用的json_annotation中,我们对DateTime类型做了定制化的转换

()
const factory User({
    DateTime? birthday,
    required DateTime createTime,
}) = _User;

DateTimeConverter的实现如下:

import 'package:json_annotation/json_annotation.dart';

class DateTimeConverter implements JsonConverter<DateTime, int> {
  const DateTimeConverter();

  
  DateTime fromJson(int timestamp) {
    return DateTime.fromMillisecondsSinceEpoch(timestamp);
  }

  
  int toJson(DateTime dateTime) {
    return dateTime.millisecondsSinceEpoch;
  }
}