不可變類且線程安全 LocalDate 、java.time.LocalTime 和LocaldateTime 新的Date和Time類
DateTimeFormatter
==https://www.cnblogs.com/blog5277/p/6407463.html
JDK8中增加了一系列時間的類,
(據說)是為了干掉過去的Date,Calendar類的,
過去的Date類(據說)有着線程不安全等諸多弊端,
至於我的個人感受就是用起來實在是很麻煩,我一般封裝成幾個常用的方法以后每次就調方法,再也不想看里面是怎么實現的了.
而發現了LocalDateTime這種新類以后,經過我的簡單的試用,覺得完全可以取代掉之前使用時間的一切方法.非常好用,太好用了.
下面是簡單的使用教程:
1,按照自由格式獲取當前時間
public static String getTodayByFormat(String timeFormat){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(timeFormat));
}
簡直優雅,甚至我都不想封裝成方法了,想用隨時寫,就是這么容易.
2,獲取當前年/月/日

一張圖說明,想怎么取,想怎么拼,都隨便
3,獲取前一天
從前我的笨方法是:
public static String getYesterdayByFormat(String timeFormat){
//獲取當前日期
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat(timeFormat);
//通過秒獲取下一天日期
long time = (date.getTime() / 1000) - 60 * 60 * 24;//秒
date.setTime(time * 1000);//毫秒
String yesterday = sf.format(date).toString();
return yesterday;
}
如今有了新方法:
public static String getYesterdayByFormat(String timeFormat){
return LocalDateTime.now().plusDays(1).format(DateTimeFormatter.ofPattern(timeFormat));
}
同理,我都不想為獲取X天后/X小時后單獨寫方法了,就在下面(以增加為例):

返回值是LocalDateTime,也就意味着可以一直鏈式點下去,想要多少天以后的數據盡管開口,一句寫不完算我輸.
4,獲取已經度過的毫秒/秒

===
看看新的LocalDate怎么用:
// 取當前日期:
LocalDate today = LocalDate.now(); // -> 2014-12-24
// 根據年月日取日期,12月就是12:
LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
// 根據字符串取:
LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 嚴格按照ISO yyyy-MM-dd驗證,02寫成2都不行,當然也有一個重載方法允許自己定義格式
LocalDate.parse("2014-02-29"); // 無效日期無法通過:DateTimeParseException: Invalid date
日期轉換經常遇到,比如:
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
// 取本月最后一天,再也不用計算是28,29,30還是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 變成了2015-01-01
// 取2015年1月第一個周一,這個計算用Calendar要死掉很多腦細胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05
==
java8 LocalDate LocalDateTime等時間類用法實例分析_java_腳本之家
http://www.jb51.net/article/110343.htm
本文實例講述了java8 LocalDate LocalDateTime等時間類用法。分享給大家供大家參考,具體如下:
這篇文章主要是java8中新的Date和Time API的實戰。新的Date和Time類是Java開發者社區千呼萬喚始出來的。Java8 之前存在的Date類一直都受人詬病,很多人都會選擇使用第三方的date庫joda-time。Java8中的date和time api是jodatime的作者參與開發的,實現了JSR310的全部內容。這些新的api都在包java.time下。
既然第三方的joda-time,date4j都已經足夠強大了,為什么java8還要重新實現他呢,一部分的原因是這些第三方的庫是存在兼容問題的,比如標准的JSF日期轉化器與joda-time api,就不兼容,每次使用都需要編寫自己的轉換器,所以標准化api是必須的,就有了JSR310,java8中就實現了他全部的規定內容。
新Date類和Time類背后的設計原則:
不可變類
java8之前,Date類都是可變類。當我們在多線程環境下使用它,編程人員應該確認Date對象的線程安全。Java8的Date和Time API提供了線程安全的不可變類。編程人員不用考慮並發的問題。
領域模型驅動設計方法
新的日期和時間的類別遵循“域驅動設計”。對於開發者來說,理解方法和類的功能是很容易的。
java.time.LocalDate:
LocalDate只提供日期不提供時間信息。它是不可變類且線程安全的。
java.time.LocalTime:
LocalTime只提供時間而不提供日期信息,它是不可變類且線程安全的。
java.time.LocalDateTime:
LocalDateTime提供時間和日期的信息,它是不可變類且線程安全的
java.time.Year:
Year提供年的信息,它是不可變類且線程安全的。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.time.Year;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
//Get year
Year year = Year.now();
System.out.println("Year ::" + year);
//know the year is leap year or not
System.out.println("Is year[" +year+"] leap year?"+ year.isLeap());
}
}
|
運行結果:
java.time.Duration:
Duration是用來計算兩個給定的日期之間包含多少秒,多少毫秒,它是不可變類且線程安全的
java.time.Period:
Period是用來計算兩個給定的日期之間包含多少天,多少月或者多少年,它是不可變類且線程安全的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
Period period = Period.between(localDate, localDate.plus(2, ChronoUnit.DAYS));
System.out.println(period.getDays());
}
}
|
運行結果:



