package com.akaiqi.chun.time;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
import static java.time.temporal.ChronoUnit.DAYS;
/**
* 日期:年-月-日
*
* @author akaiqi
* @date 2019/11/1 15:18
*/
public class LocalDateTest {
/**
* 通過靜態工廠方法of創建一個LocalDate實例
* 然後獲取這個時間年,月,日,一年的第幾天,星期幾等
*/
private static void test1() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date); //2019-11-01
int year = date.getYear();
Month month = date.getMonth();
System.out.println(month); //NOVEMBER
System.out.println(month.getValue());//11
int day = date.getDayOfMonth();
System.out.println(day);//1
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println(dayOfWeek);//FRIDAY
int len = date.lengthOfMonth();
System.out.println(len);//(這個月有)30
boolean leap = date.isLeapYear();
System.out.println(leap);//false(閏年?)
}
/**
* 從系統時鐘中獲取當前的日期,
* 使用TemporalField讀取LocalDate的值,使用get()方法獲取
* TemporalField是一個最終的、不可變的、線程安全的枚舉。
*/
private static void test2() {
LocalDate today = LocalDate.now();
System.out.println(today);
int year = today.get(ChronoField.YEAR);
int month = today.get(ChronoField.MONTH_OF_YEAR);
int day = today.get(ChronoField.DAY_OF_MONTH);
System.out.println(year + "年");//2019年
System.out.println(month + "月");//11月
System.out.println(day + "日");//1日
}
/**
* compareTo:將此日期與另一個日期進行比較。比較器值爲負,如果較小,則如果較大則爲正
* 一般都是LocalDate 類型比較,如果一些被比較的日期是不同的年表,那麼年齡也被考慮,見ChronoLocalDate.compareTo(java.time.chrono.ChronoLocalDate)
* <p>
* equals(Object obj):如果這等於其他日期,則爲真 obj=null返回false.源碼實現:同一對象返回true,是LocalDate實例,則分別按年-月-日取比較
* hashCode:日期的哈希碼,同一時間的哈希值一樣
*/
private static void test3() {
LocalDate date1 = LocalDate.of(2019, 11, 1);
LocalDate date2 = LocalDate.of(2019, 11, 2);
LocalDate date3 = LocalDate.of(2020, 11, 1);
LocalDate date4 = LocalDate.of(2019, 11, 1);
System.out.println(date1.compareTo(date2));//-1
System.out.println(date1.compareTo(date3));//-1
System.out.println(date3.compareTo(date2));//1
System.out.println(date1.equals(date4));//true
System.out.println(date1.equals(date2));//false
System.out.println(date1.hashCode());//4135617 同一時間的哈希值一樣
System.out.println(date4.hashCode());//4135617
}
/**
* format(DateTimeFormatter formatter):日期格式化
*/
private static void test4() {
LocalDate date = LocalDate.of(2019, 11, 1);
String dateStr1 = date.format(DateTimeFormatter.ofPattern("yyyy MM dd"));
System.out.println(dateStr1); //2019 11 01
String dateStr2 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(dateStr2);//2019年11月01日
String dateStr3 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月"));
System.out.println(dateStr3);//2019年11月
}
/**
* lengthOfMonth:這個月有多少天
* lengthOfYear:今年有多少天
*/
private static void test5() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.lengthOfMonth());//30
System.out.println(date.lengthOfYear());//365
}
/**
* minusMonths(long monthsToSubtract):減去monthsToSubtract個月後的日期
* minusDays(long daysToSubtract):減去daysToSubtract日後的日期
* minusMonths(long monthsToSubtract) :返回此 LocalDate一個副本,其中指定的週期以周爲單位減去
* minusYears(long yearsToSubtract) :返回此 LocalDate的副本,以減去的年份爲單位
* <p>
* minus(long amountToSubtract, TemporalUnit unit) :返回此日期的副本,減去指定的單位。unit時間單位
*/
private static void test6() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.minusMonths(1));//2019-10-01
System.out.println(date.minusDays(1));//2019-10-31
System.out.println(date.minusWeeks(1));//2019-10-25
System.out.println(date.minusYears(1));//2018-11-01
System.out.println(date.minus(1, DAYS));//2019-10-31
//同理,還有其他單位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS
}
/**
* plus(long amountToAdd, TemporalUnit unit) :返回此日期的副本,並添加指定的時間單位
* plusDays(long daysToAdd) :日增加
* plusMonths(long monthsToAdd):月增加
* plusWeeks(long weeksToAdd):星期增加
* plusYears(long yearsToAdd):年增加
*/
private static void test7() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.plus(1, DAYS));//2019-11-02
//同理,還有其他單位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS,
}
/**
* query(TemporalQuery<R> query):獲取某個字段的範圍
* range(TemporalField field)
* <p>
* toEpochDay():將此日期轉換爲大紀元日。
* <p>
* toString():輸入日期(字符串類型)
*/
private static void test8() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.range(ChronoField.DAY_OF_MONTH));//這個月的範圍:1 - 30
System.out.println(date.toEpochDay()); //18201
}
/**
* until:計算兩個LocalDate對象之間的時間量,單個TemporalUnit
* <p>
* until(Temporal endExclusive,TemporalUnit unit):兩個日期之間的相差多少,可轉換單位:DAYS,MONTHS(TemporalUnit)等
* 等價於TemporalUnit.between(Temporal, Temporal)
*/
private static void test9() {
LocalDate date1 = LocalDate.of(2019, 11, 1);
LocalDate date2 = LocalDate.of(2019, 12, 1);
System.out.println(date1.until(date2));//P1M
System.out.println(date1.until(date2, DAYS));//30
//方法二
System.out.println(DAYS.between(date1, date2));//30
}
/**
* with(TemporalField field,long newValue):按指定單位修改日期
* <p>
* withYear(int year):修改年份
* withMonth(int month):修改月份
* withDayOfMonth(int dayOfMonth):修改日
* <p>
* withDayOfYear
*/
private static void test10() {
LocalDate date = LocalDate.of(2019, 11, 1);
LocalDate date2 = date.with(DAY_OF_MONTH, 2);//2019-11-02 年月不變,修改日期
System.out.println(date2);
LocalDate date3 = date.withYear(2020);
System.out.println(date3);//2020-11-01
LocalDate date4 = date.withMonth(12);
System.out.println(date4);//2019-12-01
LocalDate date5 = date.withDayOfMonth(30);
System.out.println(date5);//2019-11-30
}
/**
* adjustInto:調整指定的時間對象與此對象的日期相同。
* 等價於使用Temporal.with(TemporalField, long)通過ChronoField.EPOCH_DAY作爲字段
*/
private static void test11() {
LocalDate date1 = LocalDate.of(2019, 11, 1);
LocalDate date2 = LocalDate.of(2020, 1, 1);
Temporal temporal = date1.adjustInto(date2);
System.out.println(temporal);//2019-11-01
System.out.println(temporal.with(date2));//2020-01-01
}
/**
* 獲取LocalDateTime:年與日時分秒
* atStartOfDay():在此日期開始之前的午夜00:00時時間
* atTime(int hour, int minute, int second):結合此日期與時間創建一個 LocalDateTime 。
* atTime(int hour, int minute)
* atTime(int hour, int minute, int second, int nanoOfSecond)
* atTime(LocalTime time) :LocalTime時分秒
*/
private static void test12() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.atStartOfDay());//2019-11-01T00:00
LocalDateTime time = date.atTime(12, 0, 0);
System.out.println(time);//2019-11-01T12:00
LocalTime localTime = LocalTime.of(1, 1, 1);
System.out.println(localTime);//01:01:01
LocalDateTime localDateTime = date.atTime(localTime);
System.out.println(localDateTime);//2019-11-01T01:01:01
}
public static void main(String[] args) {
test12();
}
}
LocalDate的API操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.