java8之前的时间类都是线程不安全的,且操作相对来说比较复杂。而java8中的时间类都是线程安全的。
而它是如何实现线程安全的呢?以LocalDateTime为例。
看LocalDateTime源码,我们可以看到这个类的实现描述:This class is immutable and thread-safe 该类是不可变且线程安全的。
LocalDateTime 是final 修饰的,其成员变量也都是final修饰的,LocalDateTime 每次调用方法都会返回一个新的实例。
private static LocalDateTime now = LocalDateTime.now(); private static Date today = new Date(); public static void main(String[] args) { System.out.println(now.toString()); now.minusDays(5); System.out.println(now.toString()); System.out.println("------------------------"); System.out.println(today.toString()); today.setTime(5); System.out.println(today.toString()); }
可以发现now是没有被改变的,而today已经变了。
下面总结下一些常见的对时间的操作(java8):
1.获取当前日期:
Date date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant())
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
2.获取几年,几个月,几周....前或者后的日期:
Date startTime = Date.from(LocalDateTime.now().minusMonths(5).atZone(ZoneId.systemDefault()).toInstant());
minusYears, minusMonths, minusWeeks...
3.获取某天的起止时间:
String beginDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIN).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); String endDate = LocalDateTime.of(LocalDate.now(), LocalTime.MAX).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
就不用在后面拼接00:00:00或者23:59:59了。