LocalDate
該類的實例是一個不可變對象,它只提供了簡單的日期,並不含當天的時間信息。另外,它也不附帶任何與時區相關的信息
public class LocalDataTest {
public static void main(String[] args) {
//你可以通過靜態工廠方法of創建一個LocalDate實例。LocalDate實例提供了多種方法來讀取常用的值,比如年份、月份、星期幾等,如下所示。
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println("date.getYear() = " + date.getYear());
System.out.println("date.getMonth() = " + date.getMonth());
System.out.println("date.getDayOfMonth() = " + date.getDayOfMonth());
System.out.println("date.getDayOfWeek() = " + date.getDayOfWeek());
System.out.println("date.lengthOfMonth() = " + date.lengthOfMonth());
System.out.println("date.isLeapYear() = " + date.isLeapYear());
//你還可以通過傳遞一個TemporalField參數給get方法拿到同樣的信息。
// TemporalField是一個接口,它定 義瞭如何訪問temporal對象某個字段的值。
// ChronoField枚舉實現了這一接口,所以你可以很方便地使用get方法得到枚舉元素的值
System.out.println("date.get(ChronoField.YEAR) = " + date.get(ChronoField.YEAR));
System.out.println("date.get(ChronoField.MONTH_OF_YEAR) = " + date.get(ChronoField.MONTH_OF_YEAR));
System.out.println("date.get(ChronoField.DAY_OF_MONTH) = " + date.get(ChronoField.DAY_OF_MONTH));
//你還可以使用工廠方法從系統時鐘中獲取當前的日期:
LocalDate today = LocalDate.now();
System.out.println("today.getDayOfMonth() = " + today.getDayOfMonth());
System.out.println("today.getDayOfWeek() = " + today.getDayOfWeek());
System.out.println("today.getYear() = " + today.getYear());
System.out.println("today.getMonth() = " + today.getMonth().getValue());
}
}
打印信息如下:
date.getYear() = 2014 date.getMonth() = MARCH date.getDayOfMonth() = 18 date.getDayOfWeek() = TUESDAY date.lengthOfMonth() = 31 date.isLeapYear() = false date.get(ChronoField.YEAR) = 2014 date.get(ChronoField.MONTH_OF_YEAR) = 3 date.get(ChronoField.DAY_OF_MONTH) = 18 today.getDayOfMonth() = 20 today.getDayOfWeek() = FRIDAY today.getYear() = 2019 today.getMonth() = 12
LocalTime
類似地,一天中的時間,比如13:45:20,可以使用LocalTime類表示。
public class LocalDataTest2 {
public static void main(String[] args) {
//你可以使用of重載的兩個工廠方法創建LocalTime的實例。第一個重載函數接收小時和分鐘,第二個重載函數同時還接收秒。
// 同LocalDate一樣,LocalTime類也提供了一些getter方法訪問這些變量的值,如下所示。
LocalTime time = LocalTime.of(13, 45, 20);
System.out.println("time.getHour() = " + time.getHour());
System.out.println("time.getMinute() = " + time.getMinute());
System.out.println("time.getSecond() = " + time.getSecond());
}
}
打印信息如下:
time.getHour() = 13 time.getMinute() = 45 time.getSecond() = 20
LocalDate和LocalTime還可以通過解析代表它們的字符串創建,使用靜態方法parse,你可以實現這一目的。
public class LocalDataTest3 {
public static void main(String[] args) {
//你可以向parse方法傳遞一個DateTimeFormatter。該類的實例定義瞭如何格式化一個日期或者時間對象。
//它是替換老版java.util.DateFormat的推薦替代品。
//一旦傳遞的字符串參數無法被解析爲合法的LocalDate或LocalTime對象,這兩個parse方法都會拋出一個繼承自RuntimeException的DateTimeParseException異常
LocalDate date = LocalDate.parse("2014-03-18");
System.out.println("date.getMonth() = " + date.getMonth().getValue());
LocalTime time = LocalTime.parse("13:45:20");
System.out.println("time.getHour() = " + time.getHour());
}
}
LocalDateTime
這個複合類名叫LocalDateTime,是LocalDate和LocalTime的合體。它同時表示了日期和時間,但不帶有時區信息,你可以直接創建,也可以通過合併日期和時間對象構造
public class LocalDataTest4 {
public static void main(String[] args) {
// 2014-03-18T13:45:20
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
//你也可以使用 或toLocalDate者toLocalTime方法,從LocalDateTime中提取LocalDate或者LocalTime 組件
LocalDate date = dt1.toLocalDate();
LocalTime time = dt1.toLocalTime();
LocalDateTime dt2 = LocalDateTime.of(date, time);
//注意,通過它們各自的atTime或者atDate方法,向LocalDate傳遞一個時間對象,或者向LocalTime傳遞一個日期對象的方式,你可以創建一個LocalDateTime對象
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
}
}
我們可以用比較直觀的方式操縱LocalDate的屬性
public class LocalDataTest5 {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-3-18
LocalDate date2 = date1.withYear(2011); //2011-3-18
LocalDate date3 = date2.withDayOfMonth(25); //2011-3-25
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9); //2011-9-25
}
}
或者用類似plus方法去操控
public class LocalDataTest6 {
public static void main(String[] args) {
//plus方法也是通用方法,它和minus方法都聲明於Temporal接口中。
//通過這些方法,對TemporalUnit對象加上 或者減去一個數字,我們能非常方便地將Temporal對象前溯或者回滾至某個時間段,
//通過 ChronoUnit 枚舉我們可以非常方便地實現TemporalUnit接口
LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-3-18
LocalDate date2 = date1.plusWeeks(1); //2014-3-25
LocalDate date3 = date2.minusYears(3); //2011-3-25
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS); //2011-9-25
}
}
DateTimeFormatter
處理日期和時間對象時,格式化以及解析日期-時間對象是另一個非常重要的功能。新的java.time.format包就是特別爲這個目的而設計的。這個包中,最重要的類是DateTime-Formatter。創建格式器最簡單的方法是通過它的靜態工廠方法以及常量。像BASIC_ISO_DATE 8和ISO_LOCAL_DATE這 樣 的 常 量 是DateTimeFormatter類 的 預 定 義 實 例 。 所 有 的 DateTimeFormatter實例都能用於以一定的格式創建代表特定日期或時間的字符串。比如,下面的這個例子中,我們使用了兩個不同的格式器生成了字符串:
public class LocalDataTest7 {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
LocalDate date1 = LocalDate.parse("20140318",
DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2014-03-18",
DateTimeFormatter.ISO_LOCAL_DATE);
}
}
DateTimeFormatter的ofPattern方法也提供了一個重載的版本,使用它你可以創建某個Locale的格式器
public class LocalDataTest8 {
public static void main(String[] args) {
//DateTimeFormatter的ofPattern方法也提供了一個重載的版本,使用它你可以創建某個Locale的格式器
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println(date.format(formatter));
//下面爲傳統的格式化時間類
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(dateFormat.format(System.currentTimeMillis()));
}
}
Date與這幾個類的互相轉換
public class DateUtil {
/**
* Date轉LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime UDateToLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* Date轉LocalDate
*/
public static LocalDate UDateToLocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}
/**
* Date轉TimeToUpdate
*/
public static LocalTime UDateToLocalTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalTime();
}
/**
* LocalDateTime轉Date
*/
public static Date LocalDateTimeToUdate(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
/**
* LocalDate轉Date
*/
public static Date LocalDateToUdate(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
/**
* LocalTime轉Date
*/
public static Date LocalTimeToUdate(LocalTime localTime, LocalDate localDate) {
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
}