java 日期相關Date、SimpleDateFormat、Calendar區別與使用

本篇文章主要摘錄了4篇文章的內容,原文在文末
在java中時間類主要有Date、Calendar、SimpleDateFormat,暫時只介紹 java.util.*下的時間類,對於java.sql.下的先不做介紹,文章比較長可以根據自己的需要看對應的內容。

目錄:
一、Date類
1.使用Date類代表當前系統時間
2.使用Date類代表指定時間
3.獲取Date對象中的信息(年月日周)
二、Calendar類
1.使用Calendar類代表當前時間
2.使用Calendar類代表指定的時間
1)指定日期中,年月日
2)指定日期年月日,中某個日期
3.Calendar類常用方法
案例:
三、SimpleDateFormat類
1.String 類型轉化成Date
2.Date類型轉化成爲String
3.其它日期格式
四、後記

一、Date類

在JDK1.0中,Date類是唯一的一個代表時間的類,但是由於Date類不便於實現國際化,所以從JDK1.1版本開始,推薦使用Calendar類進行時間和日期處理。這裏簡單介紹一下Date類的使用。
Date類中很多方法已經過時,使用Calendar來替代。

常用方法有,

long getTime()   //返回的時間是距離1970年的毫秒數

void setTime(long time)
1.使用Date類代表當前系統時間
//創建一個代表系統當前日期的Date對象
Date now = new Date();
System.out.println(date);
//Wed Dec 29 15:38:51 CST 2021

使用Date類的默認構造方法創建出來的對象就代表當前的時間,由於Date類覆蓋了toString()方法。所以可以直接輸出Date類型的對象,顯示的結果如下:Wed Dec 29 15:38:51 CST 2021

2.使用Date類代表指定時間

使用帶參數的構造方法 Date(int year, int month, int day),可以構造指定日期的Date類對象,Date類中年份的參數應該是實際需要代表的年份減去1900月份參數應該是實際需要代表的月份減去1以後的值

//創建一個代表2021年6月12號的Date對象
Date d1 = new Date(2021-1900, 6-1, 12); 
3.獲取Date對象中的信息(年月日周)
如:
Date d2 =  new Date(2014-1900, 6-1, 12);

 //獲得年份 (注意年份要加上1900,這樣纔是日期對象d2所代表的年份)
int year = d2.getYear() + 1900;
//獲得月份  (注意月份要加1,這樣纔是日期對象d2所代表的月份)
int month = d2.getMonth() + 1;
//獲得日期
int date = d2.getDate();

//獲得小時
int hour = d2.getHours();//不設置默認爲0
//獲得分鐘
int minute = d2.getMinutes();
//獲得秒
int second = d2.getSeconds();

 //獲得星期 (注意:0代表星期日、1代表星期1、2代表星期2,其他的一次類推了)
int day = d2.getDay();

使用Date類中的get方法。需要注意的是使用getYear獲得的是Date對象中年份減去1900以後的值,所以需要顯示對應的年份則需要在返回值的基礎上加1900,月份類似。在Date類中還提供了getDay方法,用於獲得Date對象代表的時間是星期幾Date類規定週日是0,週一是1,週二是2,後續的依次類推。

二、Calendar類

從JDK1.1版本開始,在處理日期和時間時,系統推薦使用Calendar類進行實現(Date的一些方法都過時了)。在設計上,Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要複雜一些,下面就介紹一下Calendar類的使用。

Calender類是一個抽象類,在實際使用時實現特定的子類的對象,使用getInstance()方法創建即可。

1.使用Calendar類代表當前時間

Calendar c = Calendar.getInstance();
System.out.println(c);
 //結果: 
 //java.util.GregorianCalendar[time=1640766764310,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=363,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=32,SECOND=44,MILLISECOND=310,ZONE_OFFSET=28800000,DST_OFFSET=0]

返回的是一個Calendar對象,由於Calendar類是抽象類,且Calendar類的構造方法是protected的,所以無法使用Calendar類的構造方法來創建對象,API中提供了getInstance方法用來創建對象。

使用該方法獲得的Calendar對象代表當前的系統時間,由於Calendar類toString實現的沒有Date類那麼直觀,所以直接輸出Calendar類的對象意義不大。

2.使用Calendar類代表指定的時間

1)指定日期中,年月日
//獲取獲取系統的當前日曆對象
Calendar c1 = Calendar.getInstance();
c1.set(2021,8-1,28);

使用過Calendar類代表特定的時間,需要首先創建一個Calendar的對象,然後在設定該對象中的年月日參數來完成。set方法的聲明爲:public final void set(int year,int month,int date)

以上示例代碼設置的時間爲2021年8月28日,其參數的結構和Date類不一樣。Calendar類中年份的數值直接書寫,月份的值爲實際的月份值減1日期的值就是實際的日期值。

備註:看見另外一種方法指定日期:

Calendar current = Calendar.getInstance();
String strTime = "2000-03-05";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
current.setTime(date);//將時間對象data設置爲新的日曆
System.out.println("修改後的系統時間爲:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));

2)指定日期年月日,中某個日期

如果只設定某個字段某個字段,例如日期的值,則可以使用如下set方法:
public void set(int field,int value),在該方法中,參數field代表要設置的字段的類型,常見類型如下:

Calendar.YEAR 年份
Calendar.MONTH 月份;
Calendar.DATE 日期;當月的第幾天
Calendar.DAY_OF_MONTH 日期,和Calendar.DATE字段完全相同;
Calendar.HOUR 12小時制的小時數;
Calendar.HOUR_OF_DAY 24小時制的小時數;
Calendar.MINUTE 分鐘;
Calendar.SECOND 秒;
Calendar.DAY_OF_WEEK 星期幾。
Calendar c1 = Calendar.getInstance();
System.out.println(c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//2021-11-29

c1.set(Calendar.DATE,10);
System.out.println("日期設置爲10號後:" + c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//日期設置爲10號後:2021-11-10

該代碼的作用是將c1對象代表的時間中日期設置爲10號,其它所有的數值會被重新計算,例如星期幾以及對應的相對時間數值等。

3.Calendar類常用方法

方法 作用
static Calendar getInstance() 使用默認時區和區域設置獲取日曆。通過該方法生成Calendar對象。如下所示:Calendar cr=Calendar.getInstance();
public void set(int year,int month,int date,int hourofday,int minute,int second) 設置日曆的年、月、日、時、分、秒。
public int get(int field) 返回給定日曆字段的值。所謂字段就是年、月、日等等。
public void setTime(Date date) 使用給定的Date設置此日曆的時間。Date------Calendar,重新設置時間
public Date getTime() 返回一個Date表示此日曆的時間。Calendar-----Date,格式:Sat Sep 08 10:10:10 CST 2012,返回一個Date時間
abstract void add(int field,int amount) 該方法的作用是在Calendar對象中的某個字段上增加或減少一定的數值,增加是amount的值爲正,減少是amount的值爲負。如下所示:Calendar c3 = Calendar.getInstance();c3.add(Calendar.DATE,100);--計算100天以後的時間
public long getTimeInMillis() 以毫秒爲單位返回該日曆的時間值。返回毫秒值

案例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class test {
    public static void main(String[] args) throws ParseException {
        //獲 取獲取系統的當前日曆對象
        Calendar current = Calendar.getInstance();

        //1、獲取今天是周幾,在Calendar類中,週日是1,週一是2,週二是3,依次類推。
        int weekDay = current.get(Calendar.DAY_OF_WEEK);
        System.out.println("今天是周:" + (weekDay - 1));

        //2、獲取系統當前年
        int year = current.get(Calendar.YEAR);
        System.out.println("今年是:" + year + "年");

        //3、獲取系統當前月
        int month = current.get(Calendar.MONTH);
        System.out.println("本月是:" + (month + 1) + "月");

        //4、獲取系統當前日
        int day = current.get(Calendar.DATE);
        System.out.println("今天是" + day + "號");

        //5、獲取上午跟下午
        int am_pm = current.get(Calendar.AM_PM);
        if (am_pm == 0)
            System.out.println("是上午");
        else
            System.out.println("是下午");

        //6、獲取當前的系統時間[date-->String]的過程
        Date time = current.getTime();//獲取的是當前系統的時間,Wed Dec 29 17:20:51 CST 2021
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        String showTime = format.format(time);
        System.out.println("當前系統時間爲:" + showTime);

        //7、自定義日曆的時間
        String strTime = "2000-03-05";
        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
        current.setTime(date);//將時間對象data設置爲新的日曆
        System.out.println("修改後的系統時間爲:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));

    }

}


在Calendar類中,週日是1,週一是2,週二是3,依次類推。

三、SimpleDateFormat類

SimpleDateFormat類可以實現java中日期格式的轉化,將String類型的時間格式轉化成Date類型或者將Date類型時間轉化成爲String類型

1.String 類型轉化成Date

try {
            String startTime = "2021-12-29";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date start = sdf.parse(startTime);
            System.out.println(start);
            //getTime():返回的時間是距離1970年的毫秒數.值不受setTime()的影響
            System.out.println(start.getTime());
        }catch (ParseException e){
            e.printStackTrace();

        }
  • 這裏要注意,傳遞進來的startTime是String類型的字符串,其格式必須和SimpleDateFormate裏面的參數形式一直,不是何格式的字符串都可以轉化,要不會出現轉發異常。
  • SimpDateFormat的parse()方法,可能拋出ParseException異常,需要異常處理

2.Date類型轉化成爲String

//獲取系統當前時間
Date now=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(now)); //2021/12/29 15:12

3.其它日期格式

SimpleDateFormat sdf0 =new SimpleDateFormat("Gyyyy年MM月dd日 HH時mm分ss秒");
 //公元2021年12月29日 15時13分32秒
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
//2021/12/29 15:13
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2021-12-29 15:13:32
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒 E ");
//2021年12月29日 15時13分32秒 星期三 
SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy/MM/dd E");
//2021/12/29 星期三
SimpleDateFormat sdf5 = new SimpleDateFormat("一年中的第 D 天 ,第w個星期 ,一個月中第W個星期 ,k時 z時區");
//一年中的第 363 天 ,第1個星期 ,一個月中第5個星期 ,15時 CST時區

SimpleDateFormat日期-時間格式模式參數::

字母 對應日期或時間元素 表示 示例
G 年代標誌符 標誌符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的週數 Number 27
W 月份中的週數 Number 2
D 年中的天數 Number 189
d 月份中的天數 Number 10
F 月份中的星期 Number 2
E 星期中的天數 Text Tuesday; Tue
a Am/pm 標記 Text PM
H 一天中的小時數(0-23) Number 0
k 一天中的小時數(1-24) Number 24
K am/pm 中的小時數(0-11) Number 0
h am/pm 中的小時數(1-12) Number 12
m 小時中的分鐘數 Number 30
s 分鐘中的秒數 Number 55
S 毫秒數 Number 978
z 時區 General time zone Pacific Standard Time; PST; GMT-08:00
Z 時區 RFC 822 time zone -0800

四、後記

最後:案例這裏就不介紹了呀,上面的三個類Date、SimpleDateFormat、Calendar理解到了,可以根據百度如何實現需求,在看別人的代碼就可以看懂了,而不是懵的,只會複製黏貼。

其實java種的類很多方法很多,不是每個都要理解到、需要用的時候可以看懂就好。但是常用的還是要理解,比如時間類,因爲工作中用到的就很多。數據就天天要使用到時間。
我還處於升級到第一步的過程中-----熟練

目前不怎麼喜歡用語雀記筆記,因爲筆記記多了,加載的時候很慢。看的時候覺得不是很方便

參考文章1:Java的Date類與Calendar類
參考文章2:java時間類Date、Calendar及用法(推薦)
參考文章3:java 中的Calendar常用方法(推薦)
參考文章4:java 日期相關Date、SimpleDateFormat、Calendar區分和使用

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