接口中可以定義默認實現方法和靜態方法 時間日期

接口中可以定義默認實現方法和靜態方法

在接口中可以使用default和static關鍵字來修飾接口中定義的普通方法

public interface Interface {
default String getName(){
return “zhangsan”;
}

static String getName2(){
    return "zhangsan";
}

}

在JDK1.8中很多接口會新增方法,爲了保證1.8向下兼容,1.7版本中的接口實現類不用每個都重新實現新添加的接口方法,引入了default默認實現,static的用法是直接用接口名去調方法即可。當一個類繼承父類又實現接口時,若後兩者方法名相同,則優先繼承父類中的同名方法,即“類優先”,如果實現兩個同名方法的接口,則要求實現類必須手動聲明默認實現哪個接口中的方法。

新的日期API LocalDate | LocalTime | LocalDateTime

新的日期API都是不可變的,更使用於多線程的使用環境中

    @Test
    public void test(){
        // 從默認時區的系統時鐘獲取當前的日期時間。不用考慮時區差
        LocalDateTime date = LocalDateTime.now();
        //2018-07-15T14:22:39.759
        System.out.println(date);

        System.out.println(date.getYear());
        System.out.println(date.getMonthValue());
        System.out.println(date.getDayOfMonth());
        System.out.println(date.getHour());
        System.out.println(date.getMinute());
        System.out.println(date.getSecond());
        System.out.println(date.getNano());

        // 手動創建一個LocalDateTime實例
        LocalDateTime date2 = LocalDateTime.of(2017, 12, 17, 9, 31, 31, 31);
        System.out.println(date2);
        // 進行加操作,得到新的日期實例
        LocalDateTime date3 = date2.plusDays(12);
        System.out.println(date3);
        // 進行減操作,得到新的日期實例
        LocalDateTime date4 = date3.minusYears(2);
        System.out.println(date4);
    }

@Test
public void test2(){
    // 時間戳  1970年1月1日00:00:00 到某一個時間點的毫秒值
    // 默認獲取UTC時區
    Instant ins = Instant.now();
    System.out.println(ins);

    System.out.println(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
    System.out.println(System.currentTimeMillis());

    System.out.println(Instant.now().toEpochMilli());
    System.out.println(Instant.now().atOffset(ZoneOffset.ofHours(8)).toInstant().toEpochMilli());
}
    @Test
    public void test3(){
        // Duration:計算兩個時間之間的間隔
        // Period:計算兩個日期之間的間隔

        Instant ins1 = Instant.now();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Instant ins2 = Instant.now();
        Duration dura = Duration.between(ins1, ins2);
        System.out.println(dura);
        System.out.println(dura.toMillis());

        System.out.println("======================");
        LocalTime localTime = LocalTime.now();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LocalTime localTime2 = LocalTime.now();
        Duration du2 = Duration.between(localTime, localTime2);
        System.out.println(du2);
        System.out.println(du2.toMillis());
    }

@Test
public void test4(){
LocalDate localDate =LocalDate.now();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    LocalDate localDate2 = LocalDate.of(2016,12,12);
    Period pe = Period.between(localDate, localDate2);
    System.out.println(pe);
}
    @Test
    public void test5(){
        // temperalAdjust 時間校驗器
        // 例如獲取下週日  下一個工作日
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);

        // 獲取一年中的第一天
        LocalDateTime ldt2 = ldt1.withDayOfYear(1);
        System.out.println(ldt2);
        // 獲取一個月中的第一天
        LocalDateTime ldt3 = ldt1.withDayOfMonth(1);
        System.out.println(ldt3);

        LocalDateTime ldt4 = ldt1.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
        System.out.println(ldt4);

        // 獲取下一個工作日
        LocalDateTime ldt5 = ldt1.with((t) -> {
            LocalDateTime ldt6 = (LocalDateTime)t;
            DayOfWeek dayOfWeek = ldt6.getDayOfWeek();
            if (DayOfWeek.FRIDAY.equals(dayOfWeek)){
                return ldt6.plusDays(3);
            }
            else if (DayOfWeek.SATURDAY.equals(dayOfWeek)){
                return ldt6.plusDays(2);
            }
            else {
                return ldt6.plusDays(1);
            }
        });
        System.out.println(ldt5);
    }
    @Test
    public void test6(){
        // DateTimeFormatter: 格式化時間/日期
        // 自定義格式
        LocalDateTime ldt = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        String strDate1 = ldt.format(formatter);
        String strDate = formatter.format(ldt);
        System.out.println(strDate);
        System.out.println(strDate1);

        // 使用api提供的格式
        DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
        LocalDateTime ldt2 = LocalDateTime.now();
        String strDate3 = dtf.format(ldt2);
        System.out.println(strDate3);

        // 解析字符串to時間
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime time = LocalDateTime.now();
        String localTime = df.format(time);
        LocalDateTime ldt4 = LocalDateTime.parse("2017-09-28 17:07:05",df);
        System.out.println("LocalDateTime轉成String類型的時間:"+localTime);
        System.out.println("String類型的時間轉成LocalDateTime:"+ldt4);
    }
// ZoneTime  ZoneDate       ZoneDateTime
@Test
public void test7(){
    LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
    System.out.println(now);

    LocalDateTime now2 = LocalDateTime.now();
    ZonedDateTime zdt = now2.atZone(ZoneId.of("Asia/Shanghai"));
    System.out.println(zdt);

    Set<String> set = ZoneId.getAvailableZoneIds();
    set.stream().forEach(System.out::println);
}

補充:

表示日期的LocalDate
表示時間的LocalTime
表示日期時間的LocalDateTime
  • 之前使用的java.util.Date月份從0開始,我們一般會+1使用,很不方便,java.time.LocalDate月份和星期都改成了enum
  • java.util.Date和SimpleDateFormat都不是線程安全的,而LocalDate和LocalTime和最基本的String一樣,是不變類型,不但線程安全,而且不能修改。
  • java.util.Date是一個“萬能接口”,它包含日期、時間,還有毫秒數,更加明確需求取捨
  • 新接口更好用的原因是考慮到了日期時間的操作,經常發生往前推或往後推幾天的情況。用java.util.Date配合Calendar要寫好多代碼,而且一般的開發人員還不一定能寫對。

LocalDate

public static void localDateTest() {

        //獲取當前日期,只含年月日 固定格式 yyyy-MM-dd    2018-05-04
        LocalDate today = LocalDate.now();

        // 根據年月日取日期,5月就是5,
        LocalDate oldDate = LocalDate.of(2018, 5, 1);

        // 根據字符串取:默認格式yyyy-MM-dd,02不能寫成2
        LocalDate yesteday = LocalDate.parse("2018-05-03");

        // 如果不是閏年 傳入29號也會報錯
        LocalDate.parse("2018-02-29");
    }


LocalDate常用轉化

/**
 * 日期轉換常用,第一天或者最後一天...
 */
public static void localDateTransferTest(){
    //2018-05-04
    LocalDate today = LocalDate.now();
    // 取本月第1天: 2018-05-01
    LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
    // 取本月第2天:2018-05-02
    LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
    // 取本月最後一天,再也不用計算是28,29,30還是31: 2018-05-31
    LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
    // 取下一天:2018-06-01
    LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1);
    // 取2018年10月第一個週三 so easy?:  2018-10-03
    LocalDate thirdMondayOf2018 = LocalDate.parse("2018-10-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.WEDNESDAY));
}

**LocalTime**

public static void localTimeTest(){
//16:25:46.448(納秒值)
LocalTime todayTimeWithMillisTime = LocalTime.now();
//16:28:48 不帶納秒值
LocalTime todayTimeWithNoMillisTime = LocalTime.now().withNano(0);
LocalTime time1 = LocalTime.parse(“23:59:59”);
}

**LocalDateTime**

public static void localDateTimeTest(){
//轉化爲時間戳 毫秒值
long time1 = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
long time2 = System.currentTimeMillis();

    //時間戳轉化爲localdatetime
    DateTimeFormatter df= DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss.SSS");

    System.out.println(df.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time1),ZoneId.of("Asia/Shanghai"))));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章