jdk8新的日期時間API

jdk8新的日期時間API

package com.zenqgifeng.practicedemo.jdk8newproperties;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * @author zengqifeng
 * @version 1.0
 * @date 2020/1/6 9:28
 * jdk8新的日期時間類
 *
 * LocalDate    LocalTime   LocalDateTime   不帶時區   ZoneLocalDate    ZoneLocalTime   ZoneLocalDateTime帶時區
 * LocalDate:處理年月日  日期  with可修改
 * LocalTime:處理時分秒  時間  with可修改
 * Instant:處理秒和毫秒和納秒   內部保存了秒和納秒    with不能直接修改(只有兩個with方法)但可加減秒毫秒納秒等
 * DateTimeFormatter    日期格式化類型定義    localDateTime.format(dtf)  LocalDateTime.prase(localDateTime,dtf)
 *          格式化和解析操作是由LocalDateTime對象和類去完成的
 * Duration:處理時間的距離 LocalTime   多少天多少時分秒    此處多少天指的是真實的多少天
 * Period:處理日期的距離 LocalDate     多少年月日       此處的日是指的月份中日的差值,而非真實相差多少天
 *      以上Duration和Period獲取差值都是第二個參數減去第一個參數  否則可能獲取到負數
 *      且都是調用方法Between來得到Duration和Period對象,進而獲取相差的值
 * ZonedLocalDate    ZonedLocalTime   ZonedLocalDateTime   帶時區
 * ZoneId   保存所有時區的類
 * zone
 * TemporalAdjust時間日期調整類以及TemporalAdjusts工具類(提供好了很多的日期調整)
 *
 * 1、舊版日期時間類存在的問題
 *      設計不合理,java.util和java.sql包下都有日期類
 *      SimpleDateFormat格式化日期是線程不安全的
 *      不支持國際化,無時區支持,因此引入了java.util.Calendar和java.util.TimeZone類,但他們同樣存在上述所有問題
 * 2、新版日期時間類
 *      LocalDate
 *      LocalTime
 *      LocalDateTime
 *
 *      創建,修改,獲取年月日,加減,比較
 *
 *       時間格式化和解析
 *  jdk8新的日期具有的優勢
 *      1、日期和時間以及秒使用對象分開管理    且都由final修飾,不得修改,返回的都是新的對象
 *      2、TemporalAdjust精確調整日期時間,可自定義或者使用TemporalAdjusts工具類中提供的
 *      3、時區的提供 ZoneId類維護時區
 *      4、日期時間的增減修改很方便  plus    min     with
 *      5、日期時間的格式化和解析線程安全
 */
public class Demo08 {

    @Test
    public void simpleDateFormatTest() {
        //線程不安全
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(2019, 01, 02);
        //存在的問題1    次構造方法構造出的日期不符合實際    Sun Feb 02 00:00:00 CST 3919
        System.out.println(date);
        String format = sdf.format(date);
        //存在的問題2    線程不安全   字符串解析爲Date時會出現解析錯誤,線程不安全問題
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                try {
                    Date date1 = sdf.parse(format);
                    System.out.println(date1);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }).start();
        }

    }

    /**
     * LocalDate  創建    修改  獲取年月日   加減  比較
     */
    @Test
    public void lcoalDateTest() {
        //當前日期
        LocalDate now = LocalDate.now();
        System.out.println(now);

        //Of方法創建日期
        LocalDate date = LocalDate.of(2019, 2, 12);
        System.out.println(date);

        //獲取年月日
        int year = date.getYear();
        int monthValue = date.getMonthValue();
        int dayOfMonth = date.getDayOfMonth();
        System.out.println(year);
        System.out.println(monthValue);
        System.out.println(dayOfMonth);

        //修改   不是直接修改原數據,而是返回一個新的LocalDate
        date = date.withYear(2078);
        date = date.withMonth(4);
        date = date.withDayOfMonth(19);
        System.out.println(date);

        //加減   返回一個新的LocalDate
        date = date.plusYears(2L);
        date = date.plusMonths(10L);
        date = date.minusDays(10L);
        System.out.println(date);

        System.out.println(date.isAfter(now));
        System.out.println(date.isBefore(now));
    }

    /**
     * LocalTime
     */
    @Test
    public void test4() {
        //創建
        LocalTime now = LocalTime.now();
        LocalTime time = LocalTime.of(13, 12, 1);
        System.out.println(now);
        System.out.println(time);
        //修改    加減
        time = time.withHour(1);
        System.out.println(time);
        time = time.withMinute(2);
        System.out.println(time);
        time = time.withSecond(10);
        System.out.println(time);

        time = time.plusHours(2);
        System.out.println(time);
        time = time.plusMinutes(10);
        System.out.println(time);
        time = time.minusSeconds(3);
        System.out.println(time);


    }

    /**
     * 時間格式化和解析   多線程下線程安全
     */
    @Test
    public void test3() {
        LocalDateTime now = LocalDateTime.now();
        //jdk提供的日期格式
        DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
        //自定義的日期格式
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH時mm分ss秒");

        //格式化日期
        String format = now.format(dtf2);
        System.out.println(format);


        //解析字符串
        String dateTime2 = "2020年01月06日15時25分57秒";
        LocalDateTime localDateTime = LocalDateTime.parse(dateTime2, dtf2);
        System.out.println(localDateTime);
    }

    /**
     * Instant保存了秒,毫秒,納秒值,專用於處理秒毫秒納秒值
     * epoch單詞意思:紀元
     */
    @Test
    public void testInstant() {
        Instant now = Instant.now();
        System.out.println(now);

        Instant epochSecond = Instant.ofEpochSecond(2);
        System.out.println(epochSecond);

        long epochSecond1 = now.getEpochSecond();
        System.out.println(epochSecond1);

        now = now.plusSeconds(3);
        System.out.println(now);
        now = now.plusMillis(100);
        System.out.println(now);
        now = now.plusNanos(1000);
        System.out.println(now);

        now = now.minusSeconds(2);
        System.out.println(now);
    }

    /**
     * Duration:計算時間之間的距離  LocalTime    第二個參數減去第一個參數
     */
    @Test
    public void testDuration() {
        LocalTime now = LocalTime.now();
        LocalTime localTime = LocalTime.of(10, 10, 10);
        Duration duration = Duration.between(localTime, now);
        long days = duration.toDays();
        System.out.println(days);
        long hours = duration.toHours();
        System.out.println(hours);
        long minutes = duration.toMinutes();
        System.out.println(minutes);
        long millis = duration.toMillis();
        System.out.println(millis);
        System.out.println(duration.toString());
    }

    /**
     * Period:LocalDate日期之間的距離      第二個參數減去第一個參數
     */
    @Test
    public void testPeriod() {
        LocalDate now = LocalDate.now();
        LocalDate date = LocalDate.of(2018, 5, 1);

        Period period = Period.between(date, now);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
        System.out.println(period.getUnits());
    }

    /**
     * 時間調整
     */
    @Test
    public void testTemporalAdjust() {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        /*//自定義的調整器   調整到下個月的1號
        TemporalAdjuster temporalAdjuster = (temporal) -> {
            LocalDateTime localDateTime = (LocalDateTime) temporal;
            LocalDateTime localDateTime1 = localDateTime.plusMonths(1);
            localDateTime1 = localDateTime1.withDayOfMonth(1);
            return localDateTime1;
        };

        Temporal temporal = temporalAdjuster.adjustInto(now);
        System.out.println(temporal);*/

        //下個月的第一天
        LocalDateTime dateTime = now.with(TemporalAdjusters.firstDayOfNextMonth());
        System.out.println(dateTime);
    }

    /**
     * 帶時區的日期時間
     */
    @Test
    public void testZonedDateTime() {
        //查看所有時區
        /*ZoneId.getAvailableZoneIds().forEach(System.out::println);*/
        //無時區   2020-01-07T09:53:40.104
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        //本地時區  默認東八區 比全球統一時區快8個小時  2020-01-07T09:53:40.104+08:00[Asia/Shanghai]
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);
        //全球統一時區    2020-01-07T01:55:38.720Z
        ZonedDateTime utcDateTime = ZonedDateTime.now(Clock.systemUTC());
        System.out.println(utcDateTime);
        //指定時區
        ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println(zonedDateTime1);
    }

    /**
     * 測試LocalDate轉換成Date
     * 毫秒值作爲轉換的橋樑
     */
    @Test
    public void testLocalDateToDate() {
        /*LocalDateTime now = LocalDateTime.now();*/
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ZonedDateTime now = ZonedDateTime.now();
        Date date = Date.from(now.toInstant());
        System.out.println(sdf.format(date));
    }

}

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