Java 8以前的庫對日期和時間的支持並不理想,爲了解決這個問題,Java 8引入了一套全新的時間日期API,位於java.time路徑下。java
LocalDate類型包含了年月日信息,下面舉些LocalDate的使用示例:bash
LocalDate date = LocalDate.of(2018, 4, 20); // 2018-04-20
int year = date.getYear(); // 2018
int month = date.getMonth().getValue(); // 4
int day = date.getDayOfMonth(); // 20
// 查看該月有多少天
int days = date.lengthOfMonth(); // 30
// 是不是閏年
boolean isLeap = date.isLeapYear(); // false
複製代碼
可使用LocalDate.now()獲取當天的日期信息:app
// 查看當天 年月日
LocalDate today = LocalDate.now(); // 2018-04-20
複製代碼
除了調用LocalDate的getYear方法外,咱們也可使用ChronoField枚舉類型來實現相同的功能:spa
int year1 = date.get(ChronoField.YEAR); // 2018
int month1 = date.get(ChronoField.MONTH_OF_YEAR); // 4
int day1 = date.get(ChronoField.DAY_OF_MONTH); // 20
// 當前日期屬於該月第幾周
int weekOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH); // 3
複製代碼
ChronoField枚舉類型包含了諸多的屬性可供選擇: code
咱們也能夠修改LocalDate對象:orm
LocalDate date3 = LocalDate.of(2018, 4, 20); // 2018-04-20
LocalDate date4 = date3.withDayOfMonth(22); // 2018-04-22
LocalDate date5 = date3.with(ChronoField.DAY_OF_MONTH, 22); // 2018-04-22
LocalDate date6 = date3.withYear(2019); // 2019-04-20
LocalDate date7 = date3.plusDays(5); // 2018-04-25
LocalDate date8 = date3.plus(5, ChronoUnit.DAYS); // 2018-04-25
LocalDate date9 = date3.minusYears(10); // 2008-04-20
複製代碼
TemporalAdjusters類提供了許多靜態方法來修改LocalDate對象。當咱們須要獲取下一個周天,下一個工做日,本月的最後一天等信息時,TemporalAdjusters類即可派上用場:cdn
import static java.time.temporal.TemporalAdjusters.*;
LocalDate date10 = date3.with(nextOrSame(DayOfWeek.MONDAY)); // 2018-04-23
LocalDate date11 = date3.with(lastDayOfMonth()); // 2018-04-30
LocalDate date12 = date3.with(previous(DayOfWeek.SATURDAY)); // 2018-04-14
複製代碼
可參考4月的日從來理解上面的結果:對象
咱們還能夠對LocalDate進行格式化操做:blog
String str1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); // 20180420
String str2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2018-04-20
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String str5 = date.format(dtf); // 2018-04-20
LocalDate date13 = LocalDate.parse(str5, dtf); // 2018-04-20
複製代碼
LocalDate和下面要介紹的LocalTime,LocalDateTime之間共享了許多相似的方法,上面介紹的LocalDate修改、格式化等方法通用適用於LocalTime和LocalDateTime。 three
LocalTime和LocalDate相似,區別在於LocalTime包含的是時分秒(毫秒)信息。舉些LocalTime的例子:
LocalTime time = LocalTime.of(20, 13, 54); // 20:13:54
int hour = time.getHour(); // 20
int minute = time.getMinute(); // 13
int second = time.getSecond(); // 54
複製代碼
LocalDate和LocalTime均可以經過字符串來建立:
LocalDate date = LocalDate.parse("2018-04-20");
LocalTime time = LocalTime.parse("20:13:54");
複製代碼
LocalDateTime是LocalDate和LocalTime的組合形式,包含了年月日時分秒信息。舉些LocalDateTime的使用示例:
LocalDateTime ldt1 = LocalDateTime.of(2018, 4, 20, 20, 13, 54); // 2018-04-20T20:13:54
LocalDateTime ldt2 = LocalDateTime.of(date, time); // 2018-04-20T20:13:54
複製代碼
LocalDateTime能夠轉換爲LocalDate和LocalTime,轉換後包含的信息減小了:
LocalDate date1 = ldt1.toLocalDate(); // 2018-04-20
LocalTime time1 = ldt1.toLocalTime(); // 20:13:54
複製代碼
一樣的,LocalDate和LocalTime也能夠轉換爲LocalDateTime,只須要補上日期或者時間:
LocalDateTime ldt3 = date.atTime(time); // 2018-04-20T20:13:54
LocalDateTime ldt4 = date.atTime(20, 13, 54); // 2018-04-20T20:13:54
LocalDateTime ldt5 = time.atDate(date); // 2018-04-20T20:13:54
複製代碼
Duration用於計算兩個LocalTime或者LocalDateTime的時間差,例如:
LocalTime time2 = LocalTime.of(23, 59, 59);
Duration duration = Duration.between(time1, time2);
long seconds = duration.getSeconds(); // 13565
複製代碼
time1和time2之間相差了13565秒。
手動建立Duration對象:
Duration threeMinutes = Duration.ofMinutes(3);
threeMinutes = Duration.of(3, ChronoUnit.MINUTES); // 建立了一個3分鐘的Duration,兩種建立方式等價
複製代碼
Period用於計算兩個LocalDate之間的時長。舉些例子:
LocalDate date2 = LocalDate.of(2018, 5, 21);
Period period = Period.between(date1, date2);
int monthsBetween = period.getMonths(); // 1
int daysBetween = period.getDays(); // 1
複製代碼
2018-04-21和2018-04-20之間月份相差1,天數相差1。
一樣的,咱們也能夠手動建立Period對象:
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
複製代碼
LocalDate date15 = LocalDate.of(2018,4,21);
date.isEqual(date15); // false
date.isAfter(date15); // false
date.isBefore(date15); // true
複製代碼
MonthDay只包含月日信息,能夠用於存放相似於生日,結婚記念日等信息。舉個使用MonthDay的例子:
LocalDate birthday = LocalDate.of(1999, 9, 9);
MonthDay monthDay = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(LocalDate.now());
if (currentMonthDay.equals(monthDay)) {
System.out.println("happy birthday!");
}
複製代碼
假如用戶的生日是1999年9月9號,那麼能夠經過這種方法來判斷今天是不是用戶的生日,若是是的話便發送生日祝福。一樣的也有YearMonth類。
Java 8 新的日期時間API還提供了不一樣時區和曆法的獲取方法,因爲較少使用並且不易於理解,這裏再也不列出。