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了。