JDK1.8新特性之時間和日期的使用

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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章