Java日期時間操作基礎——包含JDK1.8時間操作新特性

卡斯特梅的雨傘發表於2021-12-05

JDK1.7日期時間操作

時間.png
日曆.png

日曆2.png

示例小結

public class DateTest {

    public static final String FORMAT_DATE = "yyyy-MM-dd";
    public static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String FORMAT_MIN = "yyyy-MM-dd HH:mm";
    public static final String FORMAT_MILLISECOND = "yyyy-MM-dd HH:mm:ss.S";
    private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm"};

    /**
     * SimpleDateFormat時間格式化
     */
    @Test
    public void test1() throws ParseException {
        Date date = new Date();
        /**
         *常用格式:
         * yyyy-MM-dd
         * yyyy-MM-dd HH:mm:ss
         *  yyyy-MM-dd HH:mm
         */
        //根據約定好的pattern時間格式進行格式化和解析
        SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
        //格式化
        String dateStr = dateFormat.format(date);
        System.out.println(dateStr);
        //字串解析成date物件
        Date parseDate = dateFormat.parse(dateStr);
        System.out.println(parseDate);
    }
    /**
     * 2021-12-04 00:49:39
     * Sat Dec 04 00:49:39 CST 2021
     */

    /**
     * Calendar(抽象類)日曆類的使用
     */
    @Test
    public void test2() {
        //兩種建立
//        Calendar calendar = new GregorianCalendar();
        //預設用getInstance()建立
        Calendar calendar = Calendar.getInstance();
        //get()
        //根據日曆型別獲取資料
        //當天日曆對應的一個月的第幾天
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);
        //set() 設定日期
        calendar.set(Calendar.DAY_OF_MONTH, 9);
        day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);
        //新增天數,負數表示減天數
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);
        //getTime() 日曆類轉Date
        Date date = calendar.getTime();
        System.out.println(date);
        //根據Date日期設定日曆
        calendar.setTime(new Date());
        day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);
    }
    /**
     * 4
     * 9
     * 8
     * Wed Dec 08 01:55:33 CST 2021
     * 4
     */

}

JDK1.8日期時間操作——重點

LocalDateTime

LocalDateTime.png
LocalDateTime2.png
LocalDateTime3.png

示例小結

public class JDKDateTest {

    @Test
    public void test1() {
        //建立日期物件
        //獲取當前日期時間 now()
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDate);
        System.out.println(localTime);
        System.out.println(localDateTime);
//        2021-12-04
//        23:44:44.112
//        2021-12-04T23:44:44.112
        //建立指定日期時間的of()方法
        LocalDateTime dateTime = LocalDateTime.of(2020, 10, 10, 12, 12, 12);
        LocalDate date = LocalDate.of(2020, 10, 10);
        LocalTime time = LocalTime.of(12, 12, 12);
        System.out.println(dateTime);
        System.out.println(date);
        System.out.println(time);
//        2020-10-10T12:12:12
//        2020-10-10
//        12:12:12
        //getXXX方法 獲取時間裡的年月日的值相關的屬性
        int dayOfYear = dateTime.getDayOfYear();
        Month month = dateTime.getMonth();
        int monthValue = dateTime.getMonthValue();
        int dayOfMonth = dateTime.getDayOfMonth();
        System.out.println(dayOfYear);
        System.out.println(month);
        System.out.println(monthValue);
        System.out.println(dayOfMonth);
//        284
//        OCTOBER
//        10
//        10
        //withXXX() 設定指定的時間相關的屬性返回新的日期,原來的日期是不變的
        //LocalDateTime JDK時間不可變性,因此是執行緒安全的。
        LocalDateTime withDateTime1 = dateTime.with(localDateTime);
        LocalDateTime withDateTime2 = dateTime.withDayOfMonth(11);
        System.out.println("原來日期:"+dateTime);
        System.out.println("修改後日期1:"+withDateTime1);
        System.out.println("修改後日期2:"+withDateTime2);
        System.out.println("-----------------------------------");
//        原來日期:2020-10-10T12:12:12
//        修改後日期1:2021-12-04T23:44:44.112
//        修改後日期2:2020-10-11T12:12:12
        //日期時間的新增刪除
        //可以直接新增想要新增的天數或其他屬性值,返回的日期時間會自動處理為對應的日期時間
        LocalDateTime plusDateTime = dateTime.plusDays(60);
        LocalDateTime plusDateTime2 = dateTime.plusHours(70);
        //加減時間都可以操作負數,負數對應就是相反的操作,沒有問題
        LocalDateTime minusDateTime1 = dateTime.minusDays(-1);
        System.out.println("原來日期:"+dateTime);
        System.out.println(plusDateTime);
        System.out.println(plusDateTime2);
        System.out.println(minusDateTime1);
//        原來日期:2020-10-10T12:12:12
//        2020-12-09T12:12:12
//        2020-10-13T10:12:12
//        2020-10-11T12:12:12
    }
}

Instant——瞬時——類似於Date

Instant.png
Instant2.png

示例小結

public class InstantTest {

    @Test
    public void test1() {
        //獲取本初子午線對應的當前時間
        Instant instant = Instant.now();
        long timeMillis = System.currentTimeMillis();
        System.out.println(instant);
//       2021-12-04T16:16:27.593Z
        //新增東八區時間的偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);
//        2021-12-05T00:16:27.593+08:00
        //獲取19701-1-1 00:00:00到現在的毫秒數,類似於System.currentTimeMillis()
        long epochMilli = instant.toEpochMilli();
        System.out.println("toEpochMilli "+epochMilli);
        System.out.println("currentTimeMillis "+timeMillis);
//        toEpochMilli 1638634587593
//        currentTimeMillis 1638634587593
        //根據時間戳獲取Instant示例,類似於Date(long date)
        Instant instant1 = Instant.ofEpochMilli(epochMilli);
        System.out.println(instant1);
//        2021-12-04T16:16:27.593Z
    }
}

DateTimeFormatter——格式化解析

時間格式化注意

yyyy-MM-dd HH:mm:ss HH表示24小時時間制
yyyy-MM-dd hh:mm:ss HH表示12小時時間制

程式碼示例

    @Test
    public void test2(){
        LocalDateTime now = LocalDateTime.now();
        //自定義格式化型別ofPattern()
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //格式化
        String nowStr = formatter.format(now);
        System.out.println(nowStr);
        //2021-12-05 00:49:37
        //解析
        LocalDateTime dateTime = LocalDateTime.parse(nowStr, formatter);
        System.out.println(dateTime);
        //2021-12-05T00:49:37
        TemporalAccessor parse1 = formatter.parse(nowStr);
        System.out.println(parse1);
//        {},ISO resolved to 2021-12-05T00:49:37
        //強轉報錯,要使用LocalDateTime.parse(nowStr, formatter);
        //java.lang.ClassCastException: java.time.format.Parsed cannot be cast to java.time.LocalDateTime
//        LocalDateTime parse2 = (LocalDateTime) formatter.parse(nowStr);
//        System.out.println(parse2);
    }

image.png

image.png
image.png
image.png

其他

UTC 和 GMT的區別是什麼啊?

GMT(Greenwish Mean Time 格林威治平時),這是UTC的民間名稱。GMT=UTC

沒有區別。

參考

Java入門視訊教程

480-488

相關文章