LocalDateTime
LocalDateTime作为java8新加的时间类型,也是后面开发中常用的时间类型。
作为时间类型,最关注的有一下几点:
- 获取当前时间
- 获取指定时间
- 获取零点
- 时间格式化
- 时间转时间戳
- 字符串转换成时间戳
- 时间戳转时间
- 时间比较
- 时间加减
这些点通过LocalDateTime来操作,都会比较简单
获取当前时间
LocalDateTime类型
LocalDateTime time = LocalDateTime.now();
Date类型
Date date = new Date();
获取指定时间
LocalDateTime类型
- 通过原来的date和dateTime类型来生成
- 通过传年月日时分秒生成
LocalDateTime time = LocalDateTime.of(2022,11,30,6,6,6);
Date类型
原来Date类的方式。比较奇怪,他的年份会+1900,所以2022年就得是122,月份也会+1,所以11月就是10.但是这个方法呢后面会被删除,已经被标记为弃用了,使用Calendar代替。
Date date = new Date(122,10,30,6,6,6);
看一下Calendar的使用。这个年份就正常了,是2022,但是月份还是会+1.
Calendar calendar = Calendar.getInstance();
calendar.set(2022,10,30,6,6,6);
Date date = calendar.getTime();
获取零点
LocalDateTime zeroLocalDateTime = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0);
String format = zeroLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
时间格式化
时间格式化都是通过format
函数,需要传一个DateTimeFormatter
对象进去,可以通过DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
来生成自己想要的格式。
DateTimeFormatter类里面也有一些定义好的格式可以直接用,除了下面列出的还有一些其他的,感兴趣可以看一下,不过我觉得都没啥用。
- ISO_DATE_TIME 2011-12-03T10:15:30
- ISO_OFFSET_DATE_TIME 2011-12-03T10:15:30+01:00
- ISO_LOCAL_DATE_TIME 2011-12-03T10:15:30
String result = time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Date的格式化。这个需要借用SimpleDateFormat类来完成格式化。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String result= format.format(date);
时间转时间戳
时间转时间戳分为两种,一种LocalDateTime类型的时间需要转换成秒或者毫秒的时间戳,另一种是Date类型。
时间转换秒级时间戳
LocalDateTime类型
只需要直接用toEpochSecond方法就可以了。
LocalDateTime time = LocalDateTime.now();
time.toEpochSecond(ZoneOffset.ofHours(8));
Date类型
Date类型没有办法直接获取秒级时间戳,只能获取毫秒级再转秒。
时间转换毫秒级时间戳
LocalDateTime类型
转换毫秒需要先转换成instant对象,然后才能转换成毫秒级时间戳。
LocalDateTime time = LocalDateTime.now();
time.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
Date类型
Date获取毫秒就很简单了。
Date date = new Date();
date.getTime();
字符串转换成时间戳
时间转时间戳分为两种,除了上面的,还有一种是有一个格式化好的字符串,比如2022-12-18 10:00:00这种,但是这个是字符串并不是时间类型。所以要先转换成LocalDateTime类型,然后就可以转换成时间戳了。
其实就是上面格式化的一种反向操作。使用parse方法就可以了。
LocalDateTime类型
LocalDateTime.parse("2022-12-18 10:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDate.parse("2022-12-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Date类型
Date类型的字符串转时间戳也是通过SimpleDateFormat
类来完成。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2022-12-18 10:00:00");
时间戳转时间
那如果我们现在转换成时间戳以后又想转换成时间呢?也可以通过instant对象来做到。
秒时间戳转时间
LocalDateTime类型
Instant.ofEpochMilli(1671365543)
是将一个秒时间戳转换成instant对象。和上面的区别就是使用的是ofEpochMilli方法。
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(1671365543), ZoneOffset.ofHours(8));
Date类型
Date类不支持秒,只能把秒转成毫秒在转时间戳。
毫秒时间戳转时间
LocalDateTime类型
Instant.ofEpochSecond(1671365543834)
是将一个毫秒时间戳转换成一个instant对象。在通过ofInstant
方法就可以将instant对象转换成LocalDateTime对象了。
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(1669759566000L), ZoneOffset.ofHours(8));
Date类型
Date date = new Date(1669759566000L);
时间比较
LocalDateTime类型
通过compareTo方法可以进行时间的一个比较大小。如果大于会返回1,小于返回-1,等于返回0。
LocalDateTime time = LocalDateTime.now();
time.compareTo(LocalDateTime.now());
Date类型
Date也是通过compareTo方法进行比较
Date date = new Date(1669759566000L);
date.compareTo(new Date());
时间加减
LocalDateTime类型
如果加上几天,就是plusDays。加几个小时就是plusHours。当然也可以使用plus。
LocalDateTime time = LocalDateTime.now();
LocalDateTime time1 = time.plusDays(1).plusHours(1);
如果减去几天就是minusDays.减去几个小时就是minusHours。当然也可以使用minus。
LocalDateTime time = LocalDateTime.now();
LocalDateTime time1 = time.minusDays(1).minusHours(1);
Date类型
Date类不支持时间加减,只能通过Calendar类实现。
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
//加
calendar.add(Calendar.DAY_OF_MONTH, 1);
//减去
calendar.add(Calendar.DAY_OF_MONTH, -1);
时间格式在入参出参中的使用
入参的时候需要通过JsonFormat注解来指定需要的是字符串类型和对应的时间格式。
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
private LocalDate date;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime time;
出参的时候就很简单了,因为只是返回了一个字符串。
private String time;