在项目中需要对时间进行比较,而JAVA中有大概可以分为两种,一种是JDK8以前的Date类(通常配合SimpleDateFormat一起使用),和JDK8以后的time包下的各种Zone类。
在实际项目中需求为:接受前端传来的字符串,解析成时间类,进行存储、比较。
其中需要事先约定的就是时间的格式。
在swagger中可以看到示例请求的时间格式如下
其中T是分隔符,Z代表是协调世界时。在军事中,协调世界时区会使用“Z”来表示UTC(协调世界时)。UTC+8即东八区北京时间。秒数后的小数点是用于分隔毫秒和秒的。
传统API:Date、SimpleDateFormat
Date本身没有解析相关的API,而SimpleDateFormat提供了这样的能力,而Date本身实现了compareTo函数,可以直接使用进行比较。
其中 SimpleDateFormat 的模版参数如下:
- G 年代标志符
- y 年
- M 月
- d 日
- h 时 在上午或下午 (1~12)
- H 时 在一天中 (0~23)
- m 分
- s 秒
- S 毫秒
- E 星期
- D 一年中的第几天
- F 一月中第几个星期几
- w 一年中第几个星期
- W 一月中第几个星期
- a 上午 / 下午 标记符
- k 时 在一天中 (1~24)
- K 时 在上午或下午 (0~11)
- z 时区(CST)
- Z 时区(+8:00)
除此之外还可以通过System.currentTimeMillis()直接获得毫秒数
示例代码如下:
// 毫秒数
System.out.println(System.currentTimeMillis()); // 1665660325997
// 2022-10-12T06:24:56.251Z 前端格式
String time1 = "2021-1-9 12:17:22";
// SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format1.parse(time1); //转换为Date类
System.out.println(date.getTime()); // getTime -> 毫秒数 1610165842000
System.out.println(format1.format(date)); // 2021-01-09 12:17:22
String time2 = "2022-10-12T06:24:56.251Z"; // "yyyy-MM-ddThh:mm:ss.SS"
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date date2 = format2.parse(time2); //转换为Date类
System.out.println(format2.format(date2)); // 2022-10-12T06:24:56.251Z
System.out.println(date.compareTo(new Date())); // -1
System.out.println(date.compareTo(date)); // 0
System.out.println(new Date().compareTo(date)); // 1
LocalXXX
jdk8新出的时间api自带解析api和比较api,推荐使用。
有LocalTime、LocalDateTime、ZonedDateTime
主要使用的是ZonedDateTime,这个类还有几个比较重要的方法
- now() 获取现在的时间
- withFixedOffsetZone() 使用固定的偏移量和时区
- isAfter() 是否晚于某个时间
这个对象是有偏移量和时区两个参数的,随着时区的改变,偏移量和时间都会发生变化,但偏移量与时间的总和固定。在不设置withFixedOffsetZone()的时候偏移量默认为+8,时区为Asia/Shanghai,但固定了之后,这两个变量都变成了Z,表示没有偏移的时间。相关参数可以通过以下函数查看: - getOffset()
- getZone()
示例代码如下:
System.out.println(LocalDate.now()); // 2022-10-13
System.out.println(LocalTime.now()); // 16:54:32.672
System.out.println(LocalDateTime.now()); // 2022-10-13T16:54:32.672
System.out.println(ZonedDateTime.now()); // 2022-10-13T16:54:32.672+08:00[Asia/Shanghai]
System.out.println(ZonedDateTime.now().withFixedOffsetZone()); // 2022-10-13T17:30:33.392+08:00
System.out.println(ZonedDateTime.now().getOffset()); // +08:00
System.out.println(ZonedDateTime.now().getZone()); // Asia/Shanghai
System.out.println(ZonedDateTime.parse("2022-10-12T06:24:56.251Z").withFixedOffsetZone()); // 2022-10-12T06:24:56.251Z
System.out.println(ZonedDateTime.parse("2022-10-12T06:24:56.251+08:00[Asia/Shanghai]")); // 2022-10-12T06:24:56.251+08:00[Asia/Shanghai]
ZonedDateTime time = ZonedDateTime.parse("2022-10-12T06:24:56.251Z").withFixedOffsetZone();
System.out.println(time); // 2022-10-12T06:24:56.251Z
System.out.println(time.isAfter(ZonedDateTime.now().withFixedOffsetZone())); // false
System.out.println(time.getOffset()); // Z
System.out.println(time.getZone()); // Z