天天看點

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

Java基礎進階筆記 - Day01 - 第二章 日期時間類

  • Java基礎進階筆記 - Day01 - 第二章 日期時間類
    • 2.1 Date類
    • 2.2 DateFormat類
    • 2.3 練習
    • 2.4 Calendar類

Java基礎進階筆記 - Day01 - 第二章 日期時間類

系統:Win10

JDK:1.8.0_121

IDE:IntelliJ IDEA 2017.3.7

2.1 Date類

概述

java.util.Date類:表示特定的瞬間,精确到毫秒

繼續查閱Date類的描述,發現Date擁有多個構造函數,隻是部分已經過時,但是其中有未過時的構造函數可以把毫秒值轉成日期對象

  • public Date():配置設定Date對象并初始化對象,以表示配置設定它的時間(精确到毫秒)
  • public Date(long date):配置設定Date對象并初始化此對象,以表示自從标準基準時間(稱為“曆元(epoch)”,即1970年1月1日00:00:00 GMT)以來的指定毫秒數
小貼士:由于我們中國處于東八區,是以我們的基準時間為1970年1月1日8時0分0秒

簡單來說:使用無參構造,可以自動設定目前系統時間的毫秒時刻;指定long類型的構造參數,可以自定義毫秒時刻。例如:

public class DateDemo01 {
    public static void main(String[] args) {
        // 建立日期對象,把目前時間轉換為日期對象
        System.out.println(new Date()); // Wed Nov 25 16:42:38 CST 2020
        // 建立日期對象,把目前的毫秒值轉成日期對象
        System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

小貼士:在使用println方法時,會自動調用Date類中的toString方法。Date類對Object類中的toString方法進行了覆寫重寫,是以結果為指定格式的字元串

toLocaleString可以按本地時間格式輸出時間

常用方法

Date類中的多數方法已經過時,常用的方法有:

  • public long getTime():把日期對象轉換成對應的時間毫秒值

2.2 DateFormat類

java.text.DateFormat:是時間/日期格式化子類的抽象類,我們通過這個類可以幫助我們完成日期和文本之間的轉換,也就是可以在Date對象與String對象之間進行來回轉換

  • 格式化:按照指定的格式,從Date對象轉換為String對象
  • 解析:按照指定的格式,從String對象轉換為Date對象

構造方法

由于DateFormat為抽象類,不能直接使用,是以需要常用的子類java.text.SimpleDateFormat。這個類需要一個模式(格式)來指定格式化或解析的标準。構造方法為:

  • public SimpleDateFormat(String pattern):用給定的模式和預設語言環境的日期格式符号構造SimpleDateFormat

    參數pattern是一個字元串,代表日期時間的自定義格式

格式規則

常用的格式規則為:

辨別字母(區分大小寫) 含義
y 當天所在的年度
Y 當周所在的年度,跨年這一周的每一天都算下一年的年度
M
d
H
m
s
備注:更詳細的格式規則,可以參考SimpleDateFormat類的API()文檔,年的用法特别要注意,一般都用小寫的 y

建立SimpleDateFormat對象的代碼如下:

public class DateDemo02 {
    public static void main(String[] args) {
        // 對應的日期格式如:2020-11-25 19:52:56
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
}
           

常用方法

DateFormat類的常用方法有:

  • public String format(Date date):将一個Date格式化為日期/時間字元串
  • public Date parse(String source):從給定字元串開始解析文本,以生成一個日期

format方法

使用format方法的代碼如下:

/*
 将Date對象轉換成String
 */
public class DateDemo03 {
    public static void main(String[] args) {
        Date date = new Date();
        // 建立日期格式化對象,在擷取格式化對象時可以指定風格
        DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        String str = dateFormat.format(date);
        System.out.println(str);
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

parse方法

使用parse方法的代碼如下:

/*
 把String按指定格式轉換成Date對象
 */
public class DateDemo04 {
    public static void main(String[] args) throws ParseException {
        // 建立日期格式化對象,在擷取格式化對象時可以指定風格
        DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        String str = "2020年11月26日";
        Date date = dateFormat.parse(str);
        System.out.println(date); // Thu Nov 26 00:00:00 CST 2020
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

2.3 練習

使用日期時間相關的API,計算一個人已經出生了多少天

解題思路:

  1. 輸入自己出生日期
  2. 擷取目前日期
  3. 将兩個日期轉成毫秒值相減(目前時間-出生日期)
  4. 将毫秒值的內插補點轉成天

代碼實作:

/*
 使用日期時間相關的API,計算一個人已經出生了多少天
 */
public class Test {
    public static void main(String[] args) throws ParseException {
        /*
         1.輸入出生日期
         2.擷取目前日期
         3.将兩個日期轉成毫秒值相減(目前時間-出生日期)
         4.将毫秒值的內插補點轉成天
         */
        // 1.輸入出生日期
        System.out.println("請輸入出生日期:格式 yyyy-MM-dd");
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date birthday = dateFormat.parse(str);
        // 2.擷取目前日期
        Date today = new Date();
        // 3.将兩個日期轉成毫秒值相減
        long time = today.getTime() - birthday.getTime();
        // 4.将毫秒值的內插補點轉成天
        long day = time / 1000 / 60 / 60 / 24;
        if (day < 0) {
            System.out.println("還沒出生!");
        } else {
            System.out.println(day);
        }
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

2.4 Calendar類

概念

以前我們生活中應該都有見到過手撕的紙質月曆

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

java.util.Calendar 是月曆類,在Date後出現,替換掉了許多Date的方法。該類将所有可能用到的時間資訊封裝為靜态成員變量,友善擷取。月曆類就是友善擷取各個時間屬性的

擷取方式

Calendar為抽象類,由于語言敏感性,Calendar類在建立對象時并非直接建立,而是通過靜态方法建立,傳回子類對象,如下:

Calendar靜态方法

  • public static Calendar getInstance():使用預設時區和語言環境獲得一個月曆

    例如:

public class CalendarDemo01 {
    public static void main(String[] args) throws ParseException {
        Calendar calendar = Calendar.getInstance();
    }
}
           

常用方法

根據Calendar類的API文檔,常用方法有:

  • public int get(int field):傳回給定月曆字段的值
  • public void set(int field, int value):将給定的月曆字段設定為給定值
  • public abstract void add(int field, int amount):根據月曆的規則,為給定的月曆字段添加或減去指定的時間量
  • public Date getTime():傳回一個表示此Calendar時間值(從曆元[即格林威治标準時間1970年1月1日的00:00:00]至現在的毫秒偏移量)的Date對象

Calendar類中提供很多成員常量,代表給定的月曆字段:

字段值 含義
YEAR
MONTH 月(從0開始,可以+1使用)
DAY_OF_MONTH 月中的天(幾号)
HOUR 時(12小時制)
HOUR_OF_DAY 時(24小時制)
MINUTE
SECOND
DAY_OF_WEEK 周中的天(周幾,周日為1,可以-1使用)

get/set方法

get方法用來擷取指定字段的值,代碼如下:

public class CalendarDemo02 {
    public static void main(String[] args) throws ParseException {
        // 建立Calendar對象
        Calendar calendar = Calendar.getInstance();
        // 擷取年
        int year = calendar.get(Calendar.YEAR);
        // 擷取月
        int month = calendar.get(Calendar.MONTH) + 1;
        // 擷取日
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + day + "日");
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

set方法用來設定指定字段的值,代碼如下:

public class CalendarDemo03 {
    public static void main(String[] args) throws ParseException {
        // 建立Calendar對象
        Calendar calendar = Calendar.getInstance();
        // 設定年
        calendar.set(Calendar.YEAR, 2345);
        // 設定月
        calendar.set(Calendar.MONTH, 05);
        // 設定日
        calendar.set(Calendar.DAY_OF_MONTH, 07);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + day + "日");
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

add方法

add方法可以對指定月曆字段的值進行加減操作,如果第二個參數為正數則加上偏移量,如果為負數則減去偏移量。代碼如下:

public class CalendarDemo04 {
    public static void main(String[] args) throws ParseException {
        // 建立Calendar對象
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + day + "日");
        // 使用add方法
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -14);
        int year1 = calendar.get(Calendar.YEAR);
        int month1 = calendar.get(Calendar.MONTH) + 1;
        int day1 = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(year1 + "年" + month1 + "月" + day1 + "日");
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

getTime方法

Calendar中的getTime方法并不是擷取毫秒值,而是拿到對應的Date對象

public class CalendarDemo05 {
    public static void main(String[] args) throws ParseException {
        // 建立Calendar對象
        Calendar calendar = Calendar.getInstance();
        Date date = calendar.getTime();
        System.out.println(date);
    }
}
           

運作結果:

【Java基礎進階筆記】- Day01 - 第二章 日期時間類Java基礎進階筆記 - Day01 - 第二章 日期時間類

小貼士:

西方星期的開始為周日,中國為周一。是以DAY_OF_WEEK中的1-7代表周日-周六

在Calendar類中,月份的表示是以0-11代表1-12月

日期是有大小關系的,時間靠後,時間越大