时间类型的选取
About 1 min
Java中提供的时间类型可谓五花八门,从最开始的Date
类型,再后面引入LocalDate
和LocalDateTime
这些类型,再有ZonedDateTime
和OffsetDateTime
等等粉墨登场,半路还杀出个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需要作DateTime
和int
类型的转换。于是使用的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;
}
}