java 數據結構(三):java經常使用類 三 日期時間API

JDK 8以前日期時間API

1.獲取系統當前時間:System類中的currentTimeMillis()
long time = System.currentTimeMillis();
//返回當前時間與1970年1月1日0時0分0秒之間以毫秒爲單位的時間差。
//稱爲時間戳
System.out.println(time);java

2. java.util.Date類與java.sql.Date類sql

複製代碼

/*
    java.util.Date類
           |---java.sql.Date類

    1.兩個構造器的使用
        >構造器一:Date():建立一個對應當前時間的Date對象
        >構造器二:建立指定毫秒數的Date對象
    2.兩個方法的使用
        >toString():顯示當前的年、月、日、時、分、秒
        >getTime():獲取當前Date對象對應的毫秒數。(時間戳)

    3. java.sql.Date對應着數據庫中的日期類型的變量
        >如何實例化
        >如何將java.util.Date對象轉換爲java.sql.Date對象
     */
    @Test
    public void test2(){
        //構造器一:Date():建立一個對應當前時間的Date對象
        Date date1 = new Date();
        System.out.println(date1.toString());//Sat Feb 16 16:35:31 GMT+08:00 2019

        System.out.println(date1.getTime());//1550306204104

        //構造器二:建立指定毫秒數的Date對象
        Date date2 = new Date(155030620410L);
        System.out.println(date2.toString());

        //建立java.sql.Date對象
        java.sql.Date date3 = new java.sql.Date(35235325345L);
        System.out.println(date3);//1971-02-13

        //如何將java.util.Date對象轉換爲java.sql.Date對象
        //狀況一:
//        Date date4 = new java.sql.Date(2343243242323L);
//        java.sql.Date date5 = (java.sql.Date) date4;
        //狀況二:
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());


    }

複製代碼

3. java.text.SimpleDataFormat類
SimpleDateFormat對日期Date類的格式化和解析
1.兩個操做:
1.1 格式化:日期 --->字符串
1.2 解析:格式化的逆過程,字符串 ---> 日期數據庫

2.SimpleDateFormat的實例化:new + 構造器安全

複製代碼

//*************照指定的方式格式化和解析:調用帶參的構造器*****************
//        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //格式化
        String format1 = sdf1.format(date);
        System.out.println(format1);//2019-02-18 11:48:27
        //解析:要求字符串必須是符合SimpleDateFormat識別的格式(經過構造器參數體現),
        //不然,拋異常
        Date date2 = sdf1.parse("2020-02-18 11:48:27");
        System.out.println(date2);

複製代碼

小練習:ide

複製代碼

/*
    練習一:字符串"2020-09-08"轉換爲java.sql.Date

    練習二:"天打漁兩天曬網"   1990-01-01  xxxx-xx-xx 打漁?曬網?

    舉例:2020-09-08 ? 總天數

    總天數 % 5 == 1,2,3 : 打漁
    總天數 % 5 == 4,0 : 曬網

    總天數的計算?
    方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1
    方式二:1990-01-01  --> 2019-12-31  +  2020-01-01 -->2020-09-08
     */
    @Test
    public void testExer() throws ParseException {
        String birth = "2020-09-08";

        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf1.parse(birth);
//        System.out.println(date);

        java.sql.Date birthDate = new java.sql.Date(date.getTime());
        System.out.println(birthDate);
    }

複製代碼

4.Calendar類:日曆類、抽象類線程

複製代碼

//1.實例化
        //方式一:建立其子類(GregorianCalendar的對象
        //方式二:調用其靜態方法getInstance()
        Calendar calendar = Calendar.getInstance();
//        System.out.println(calendar.getClass());

        //2.經常使用方法
        //get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

        //set()
        //calendar可變性
         calendar.set(Calendar.DAY_OF_MONTH,22);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //add()
        calendar.add(Calendar.DAY_OF_MONTH,-3);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //getTime():日曆類---> Date
        Date date = calendar.getTime();
        System.out.println(date);

        //setTime():Date ---> 日曆類
        Date date1 = new Date();
        calendar.setTime(date1);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

複製代碼

 JDK8中新日期時間APIcode

1.日期時間API的迭代:
第一代:jdk 1.0 Date類
第二代:jdk 1.1 Calendar類,必定程度上替換Date類
第三代:jdk 1.8 提出了新的一套APIorm

2.前兩代存在的問題舉例:
可變性:像日期和時間這樣的類應該是不可變的。
偏移性:Date中的年份是從1900開始的,而月份都從0開始。
格式化:格式化只對Date用,Calendar則不行。
此外,它們也不是線程安全的;不能處理閏秒等。對象

3.java 8 中新的日期時間API涉及到的包字符串

 

 

4.本地日期、本地時間、本地日期時間的使用:LocalDate / LocalTime / LocalDateTime
4.1 說明:
① 分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間信息,也不包含與時區相關的信息。
② LocalDateTime相較於LocalDate、LocalTime,使用頻率要高
③ 相似於Calendar

4.2 經常使用方法:

 

 

5.時間點:Instant
5.1 說明:
① 時間線上的一個瞬時點。 概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC開始的秒數。)
② 相似於 java.util.Date類

5.2 經常使用方法:

 

 

6.日期時間格式化類:DateTimeFormatter
6.1 說明:
① 格式化或解析日期、時間
② 相似於SimpleDateFormat
6.2 經常使用方法:
① 實例化方式:
預約義的標準格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相關的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」)

② 經常使用方法:

 

 

特別的:自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」)
// 重點:自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09

//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);

7.其它API的使用 (不講)
7.1 帶時區的日期時間:ZonedDateTime / ZoneId

舉例:

複製代碼

// ZoneId:類中包含了所的時區信息
    @Test
    public void test1(){
        //getAvailableZoneIds():獲取所的ZoneId
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();
        for(String s : zoneIds){
            System.out.println(s);
        }
        System.out.println();
        
        //獲取「Asia/Tokyo」時區對應的時間
        LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println(localDateTime);
        
        
    }
//ZonedDateTime:帶時區的日期時間
    @Test
    public void test2(){
        //now():獲取本時區的ZonedDateTime對象
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);
        //now(ZoneId id):獲取指定時區的ZonedDateTime對象
        ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println(zonedDateTime1);
    }

複製代碼

7.2 時間間隔:Duration--用於計算兩個「時間」間隔,以秒和納秒爲基準

 

 舉例:

複製代碼

@Test
    public void test3(){
        LocalTime localTime = LocalTime.now();
        LocalTime localTime1 = LocalTime.of(15, 23, 32);
        //between():靜態方法,返回Duration對象,表示兩個時間的間隔
        Duration duration = Duration.between(localTime1, localTime);
        System.out.println(duration);
        
        System.out.println(duration.getSeconds());
        System.out.println(duration.getNano());
        
        LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
        LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
        
        Duration duration1 = Duration.between(localDateTime1, localDateTime);
        System.out.println(duration1.toDays());
        
    }

複製代碼

7.3 日期間隔:Period --用於計算兩個「日期」間隔,以年、月、日衡量

 

 舉例:

複製代碼

@Test
    public void test4(){
        LocalDate localDate = LocalDate.now();
        LocalDate localDate1 = LocalDate.of(2028, 3, 18);
        
        Period period = Period.between(localDate, localDate1);
        System.out.println(period);
        
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
        
        Period period1 = period.withYears(2);
        System.out.println(period1);
        
    }

複製代碼

7.4 日期時間校訂器:TemporalAdjuster
舉例:

複製代碼

@Test
    public void test5(){
        //獲取當前日期的下一個週日是哪天?
        TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
        
        LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
        System.out.println(localDateTime);
        
        //獲取下一個工做日是哪天?
        LocalDate localDate = LocalDate.now().with(new TemporalAdjuster(){

            @Override
            public Temporal adjustInto(Temporal temporal) {
                LocalDate date = (LocalDate)temporal;
                if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){
                    return date.plusDays(3);
                }else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
                    return date.plusDays(2);
                }else{
                    return date.plusDays(1);
                }
                    
            }
            
        });
        
        System.out.println("下一個工做日是:" + localDate);
    }

複製代碼

相關文章
相關標籤/搜索