Java时间API

在项目中需要对时间进行比较,而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

猜你喜欢

转载自blog.csdn.net/weixin_45654405/article/details/127305932