Java經常使用類-時間和日期類

開發中常常涉及到時間與日期,記錄下Java中與時間和日期相關的API

JDK8以前與時間日期相關的類

java.lang.System類

System類提供了一個公共的靜態方法currentTimesMillis()來返回當前時間距離1970年1月1日0時0分0秒之間以毫秒爲單位的時間差,也叫時間戳。java

@Test
public void test1(){
        long time = System.currentTimeMillis();
        System.out.println(time);// 打印:1572305456261
    }

java.util.Date類和java.sql.Date類

一個類的使用一般須要瞭解如何實例化和使用經常使用的方法。java.util.Date類的實例化主要涉及到兩個構造器無參的構造器和帶參數的構造器,經常使用方法也有兩個toString方法和getTime方法。代碼看下具體的使用:sql

@Test
    public void test2(){
        // 構造器1
        Date date1 = new Date();
        System.out.println(date1.toString());// Tue Oct 29 07:35:09 CST 2019
        System.out.println(date1.getTime());// 1572305836011

        // 構造器2
        Date date2 = new Date(1572305836011L);
        System.out.println(date2.toString()); // Tue Oct 29 07:37:16 CST 2019

說明:
關於java.util.Date類須要會使用兩個構造器和兩個方法。數據庫

  • 使用空參的構造器: 建立一個對應當前時間的Date對象
  • 使用帶參的構造器:建立指定毫秒數的Date對象
  • 使用toString方法:顯示當前的年,月,日,分,時,秒,時區
  • 使用getTime方法,獲取當前Data對象對應的時間戳

java.sql.Date類是java.util.Date類的子類,主要用於處理數據庫相關的日期格式。這裏,一樣只須要了解怎麼使用便可。
實例化,使用帶參的構造器,參數是一個long型的。安全

@Test
public void tese1(){
         // java.sql.Date類的使用
        java.sql.Date date3 = new java.sql.Date(1572305836011L);// 傳入時間戳
        System.out.println(date3.toString());// 2019-10-29
        System.out.println(date3.getTime());//1572305836011

        // 如何將一個java.sql.Date對象轉化爲java.util.Date對象?多態
        // 如何將一個java.util.Date對象轉化爲java.sql.Date對象?共同點:毫秒數
        // 方式一: 多態的作法,強轉
        Date date4 = new java.sql.Date(1572305836011L);
        java.sql.Date date5 = (java.sql.Date)date4;

        // 方式二:
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());
        System.out.println(date7.toString());
}

java.text.SimpleDateFormat類

Date類的API不易於國際化,大部分被廢棄了,java.text.SimpleDateFormat類是一個不與語言環境有關的方式來格式化和解析日期的具體類。它容許進行 格式化:日期-->文本解析:文本-->日期
對於SimpleDateFormat的使用須要掌握兩個點:spa

  1. 如何實例化?
  2. 如何進行格式化和解析?
@Test
    public void test1() throws ParseException {
        // 1.實例化:使用默認的構造器
        SimpleDateFormat sdf = new SimpleDateFormat();
        // 2.建立Date對象
        Date date = new Date();
        System.out.println(date); // Tue Oct 29 13:42:21 CST 2019
        // 3.格式化
        String date2 = sdf.format(date); //參數是Date類型的
        System.out.println(date2); // 2019/10/29 下午1:43
        // 4.解析
        String str = "2019/10/29 下午1:43";
        Date date3 = sdf.parse(str);
        System.out.println(date3);

        //***************************
        //使用帶參的構造器
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String s = simpleDateFormat.format(new Date());
        System.out.println(s);
        //解析
        String s1 = "2020-10-29 02:02:59";
        Date date4 = simpleDateFormat.parse(s1);
        System.out.println(date4);
    }

說明:
使用SimpleDateFormat的默認構造器建立出來的對象,去調用format方法進行時間日期的格式化後出來的格式是固定的,而且是2019/10/29 下午1:43這樣的形式,要解析的字符串也必須以這種格式,不然解析不了。
開發中,經常使用第二種構造器,能夠指定咱們想過要輸出的日期格式。線程

java.util.Calender日曆類(抽象類)

Calendar是一個抽象基類,主用用於完成日期字段之間相互操做的功能。獲取一個Calendar實例的方法以下:code

  • 使用Calendar.getInstance()方法
  • 調用它的子類GregorianCalendar的構造器。

Calender的常見使用以下:orm

@Test
    public void test1(){
        //1.類的實例化方式:調用Calendar.getInstance方法
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass());// class java.util.GregorianCalendar

        //2.經常使用方法
        //get()方法
        int day1 = calendar.get(calendar.DAY_OF_MONTH);// 獲取calender對象是當前月的第幾天
        int day2 = calendar.get(calendar.DAY_OF_YEAR);// 獲取當前calender對象是當前年的第幾天
        System.out.println(day1);
        System.out.println(day2);

        //set()方法
        calendar.set(calendar.DAY_OF_MONTH,22); // 將calender對象的DAY_OF_MONTH屬性設置爲22,將原先的屬性改了(可變性)
        day1 = calendar.get(calendar.DAY_OF_MONTH);
        System.out.println(day1);

        //add()方法
        calendar.add(calendar.DAY_OF_MONTH,3); // +3天
        day1 = calendar.get(calendar.DAY_OF_MONTH);
        System.out.println(day1);
        calendar.add(calendar.DAY_OF_MONTH,-3);// -3天
        day1 = calendar.get(calendar.DAY_OF_MONTH);
        System.out.println(day1);

        //getTime()方法 將日曆類轉換爲Date
        Date date = calendar.getTime();
        System.out.println(date); //Tue Oct 22 13:06:05 CST 2019

        //setTime()方法 將Date類轉換爲日曆類
        Date date1 = new Date(); // 獲取當前時間的Date
        calendar.setTime(date1);// 將當前日曆設置爲date1對象對應的時間
        day1 = calendar.get(calendar.DAY_OF_MONTH);
        System.out.println(day1);
    }

注意:使用Calender
獲取月份時,一月是0,二月是1,以此類推,12月是11
獲取星期時,週日是1,週一是2,以此類推,週六是7對象

JDK8以後新的日期時間API

爲何要引進新的時間日期API?
JDK 1.0中包含了一個java.util.Date類,可是它的大多數方法已經在JDK 1.1引入Calendar類以後被棄用了。而Calendar並不比Date好多少。它們面臨的問題是:blog

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

JDK8中引進了新的時間API是java.time,新的 java.time 中包含了全部關於本地日期(LocalDate)本地時間(LocalTime)本地日期時間(LocalDateTime)時區(ZonedDateTime)和持續時間(Duration)的類。歷史悠久的 Date 類新增了 toInstant() 方法,用於把 Date 轉換成新的表示形式。這些新增的本地化時間日期 API 大大簡化了日期時間和本地化的管理。

LocalDate、LocalTime、LocalDateTime類

LocalDate、LocalTime、LocalDateTime 類是其中較重要的幾個類,它們的實例是不可變的對象,分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間信息,也不包含與時區相關的信息。

  • LocalDate表明IOS格式(yyyy-MM-dd)的日期,能夠存儲 生日、記念日等日期。
  • LocalTime表示一個時間,而不是日期。
  • LocalDateTime是用來表示日期和時間的,這是一個最經常使用的類之一。

一樣,使用一個類仍是從如何實例化和有什麼方法使用開始。經常使用方法以下:

image.png

示例:

@Test
    public void test1(){
        // now獲取當前的日期、時間、日期+時間
        LocalDate localDate = LocalDate.now();// 獲取當前的本地日期
        LocalTime localTime = LocalTime.now();// 獲取當前的本地時間
        LocalDateTime localDateTime = LocalDateTime.now();// 獲取當前的本地日期和本地時間

        System.out.println(localDate); // 2019-10-31
        System.out.println(localTime);// 13:35:03.225722700
        System.out.println(localDateTime);// 2019-10-31T13:35:03.225722700

        // of方法:設置年月日時分秒,沒有偏移量
        LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 24, 13, 23, 56);
        System.out.println(localDateTime1); // 2020-10-24T13:23:56

        //getXxx()方法 獲取屬性
        System.out.println(localDateTime1.getDayOfMonth());// 24 獲取當前對象對應的日期是這個月的第幾天
        System.out.println(localDateTime1.getDayOfWeek());// SATURDAY 獲取當前對象對應的日期是星期幾
        System.out.println(localDateTime1.getDayOfYear());// 298 獲取當前天是這一年的第幾天
        System.out.println(localDateTime1.getMonth());// OCTOBER 獲取月份
        System.out.println(localDateTime1.getSecond());// 56 獲取秒數

        // withXxx() 設置相關的屬性(體現不可變性,原先對象的with操做不會改變原來對象的屬性)
        LocalDateTime localDateTime2 = localDateTime.withHour(4); // 設置小時數爲04
        System.out.println(localDateTime); // 2019-10-31T13:41:51.553487900
        System.out.println(localDateTime2);// 2019-10-31T04:41:51.553487900

        // plusXxx() 加操做
        LocalDateTime localDateTime3 = localDateTime.plusDays(5); // 在現有時間加上5天
        System.out.println(localDateTime); // 2019-10-31T13:45:29.363506800
        System.out.println(localDateTime3);// 2019-11-05T13:45:29.363506800

        // minusXxx() 減操做
        LocalDateTime localDateTime4 = localDateTime.minusMonths(2); // 在現有時間減去2個月
        System.out.println(localDateTime.getMonth()); // OCTOBER
        System.out.println(localDateTime4.getMonth());// AUGUST

    }

經常使用仍是LocalDateTime類。

Instant類

Instant類相似於Date類, java.time包經過值類型Instant提供機器視圖,不提供處理人類意義上的時間單位。Instant表示時間線上的一點,而不須要任何上下文信息,例如,時區。概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC)開始的秒數。由於java.time包是基於納秒計算的,因此Instant的精度能夠達到納秒級。

Instant的實例化和經常使用方法以下:

方法 說明
now() 靜態方法,返回默認UTC時區的Instant類的對象
ofEpochMilli(long EpochMilli) 靜態方法,返回在1970-01-01 00:00:00基礎上加上指定毫秒數以後的Instant類的對象
atOffset(ZoneOffset offset) 結合即時的偏移來建立一個 OffsetDateTime
toEpochMilli() 返回1970-01-01 00:00:00到當前時間的毫秒數,即爲時間戳

示例:

@Test
    public void test2(){
        // now():獲取本初子午線當地的標準時間
        Instant instant = Instant.now();
        System.out.println(instant); // 2019-10-31T06:01:04.921252200Z
       
        // 在UTC時區的基礎上加上8個時區(北京時間)
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime); // 2019-10-31T14:01:04.921252200+08:00
        
        // 獲取時間戳
        System.out.println(instant.toEpochMilli()); // 1572501664921
       
        // ofEpochMilli():經過給定的時間戳,獲取Instant的實例
        Instant instant1 = Instant.ofEpochMilli(1572415933220L);
        System.out.println(instant1); // 2019-10-30T06:12:13.220Z
    }

DateTimeFormatter類

DateTimeFormatter類相似於SimpleDateFormat類,用於格式化與解析日期或時間。
java.time.format.DateTimeFormatter 類:該類提供了三種格式化方法:

  • 預約義的標準格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
  • 本地化相關的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
  • 自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」),經常使用是這種。
方 法 描 述
ofPattern(String pattern) 靜態方法,返回一個指定字符串格的DateTimeFormatter
format(TemporalAccessor t) 格式化一個日期、時間,返回字符串
parse(CharSequence text) 將指定格式的字符序列解析爲一個日期、時間

示例以下:

@Test
    public void testDateTimeFormatter(){
        // 實例化方式一 預約義的標準格式。如:`ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME`
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        LocalDateTime localDateTime = LocalDateTime.now();

        // 格式化:將日期轉換爲字符串,須要傳入一個TemporalAccessor類型的,而LocalDate、LocalTime和LocalDateTime都是
        String str1 = formatter.format(localDateTime);
        System.out.println(localDateTime); // 2019-10-31T14:16:15.801854
        System.out.println(str1); // 2019-10-31T14:16:15.801854
        // 使用標準格式的格式化出來結果是:2019-10-31T14:16:15.801854

        // 解析:解析的字符串也必須是標準格式的字符創
        TemporalAccessor parse = formatter.parse("2020-10-31T14:16:15.801854");
        System.out.println(parse); // {},ISO resolved to 2020-10-31T14:16:15.801854

        // 實例化方式二:本地化相關的格式
        DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);// 使用FormatStyle.SHORT進行格式化
        // 格式化
        String str2 = formatter1.format(localDateTime);
        System.out.println(str2); // 格式化後的格式:2019/10/31 下午2:22

        // 實例化方式三:自定義格式
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        // 格式化
        String str3 = formatter2.format(LocalDateTime.now());
        System.out.println(str3);
        // 解析
        TemporalAccessor parse1 = formatter2.parse("2019-10-31 02:30:29");
        System.out.println(parse1);
    }
相關文章
相關標籤/搜索