JAVA日期時間(Calendar/Date)

java.util包下的Calendar和Date類來處理有關於時間操作.

 java.util.Date

 Date 類提供兩個構造函數來實例化 Date 對象。

第一個構造函數使用當前日期和時間來初始化對象。

Date()

第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。

Date(long millisec)

當調用無參構造方法時即爲獲取當前時間.

對於Date類常見的操作有時間的比較,按特定格式格式化Date,將String類型時間字符串轉換爲Date類型

1.日期比較

Java使用以下三種方法來比較兩個日期:

  • 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),然後比較這兩個值.
  • 使用方法 before(Date date),after(Date date) 和 equals(Object object).
  • 使用 compareTo() 方法.

方法定義如下:

boolean after(Date date)

若當調用此方法的Date對象在指定日期之後返回true,否則返回false

boolean before(Date date)

如當調用此方法的Date對象在指定日期之前返回true,否則反水false

int compareTo(Date anotherDate)

比較調用當前方法的Date對象和指定的anotherDate對象.相等返回0,調用對象在指定對象之前返回負數,反之返回正數

2.Date轉換成指定格式的字符串

SimpleDateFormat 是一個以語言環境敏感的方式來格式化和分析日期的類。SimpleDateFormat 允許你選擇任何用戶自定義日期時間格式來運行

SimpleDateFormat的構造方法如下:
SimpleDateFormat(String pattern)

時間模式字符串常見的如下:
字母描述示例

y四位年份2001
M月份July or 07
d一個月的日期10
h A.M./P.M. (1~12)格式小時12
H一天中的小時 (0~23)22
m分鐘數30
s秒數55
S毫秒數234
E星期幾Tuesday
D一年中的日子360
F一個月中第幾周的周幾2 (second Wed. in July)
w一年中第幾周40
W一個月中第幾周1
aA.M./P.M. 標記

PM

使用SimpleDateFormatter.format(Date date)方法將Date類型對象轉換成字符串
實例:
   SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat1.format(new Date());
        System.out.println(format);//2018-06-25 17:12:22

3.時間類型字符串轉換成Date對象

SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。例如:

public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); 
      String input = "2018-06-25 17:12:22"; 
      Date t; 
      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }

java.util.calendar

Date對象創建以及Date對象與String類型的轉換,java.util.Date比較擅長,但是設置和獲取日期數據的特定部分呢,比如說小時,日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類

創建一個代表系統當前日期的Calendar對象

Calendar c = Calendar.getInstance();//默認是當前日期

創建一個指定日期的Calendar對象

使用Calendar類代表特定的時間,需要首先創建一個Calendar的對象,然後再設定該對象中的年月日參數來完成。

//創建一個代表2009年6月12日的Calendar對象
Calendar c1 = Calendar.getInstance();
//c1.set(int year,int month,int day)
c1.set(2009, 6 - 1, 12);//month從0開始

Calendar類對象字段類型

Calendar類中用以下這些常量表示不同的意義,jdk內的很多類其實都是採用的這種思想

常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意義完全相同
Calendar.HOUR12小時制的小時
Calendar.HOUR_OF_DAY24小時制的小時
Calendar.MINUTE分鐘
Calendar.SECOND
Calendar.DAY_OF_WEEK星期幾

如果只設定某個字段,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

實例:

calendar.set(Calendar.YEAR, 2017);
        calendar.set(Calendar.MONDAY, 2);
        calendar.set(Calendar.DATE, 30);
        calendar.add(Calendar.MONDAY, 5);

Calendar類對象信息的獲得

Calendar c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
// 獲得星期幾(注意(這個與Date類是不同的):1代表星期日、2代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);

Calendar與Date對象的轉換

 Calendar-->Date

Calendar calendar=Calendar.getInstance();  
Date time = calendar.getTime();
 Date-->Calendar
Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);
補充:

Calendar類實現了公曆日曆,GregorianCalendar是Calendar類的一個具體實現。

Calendar 的getInstance()方法返回一個默認用當前的語言環境和時區初始化的GregorianCalendar對象

在判斷是否爲閏年是可以使用isLeapYear(int year)

boolean isLeapYear(int year)

確定給定的年份是否爲閏年。

實例:

    public static void main(String[] args) {
//在具有默認語言環境的默認時區內使用當前時間構造一個默認的 GregorianCalendar。
        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        int year = gregorianCalendar.get(Calendar.YEAR);
        if (gregorianCalendar.isLeapYear(year)) {
            System.out.println("今年是閏年!");
        } else {
            System.out.println("今年不是閏年!");
        }
    }

Java 8通過發佈新的Date-Time API (JSR 310)來進一步加強對日期與時間的處理。

在舊版的 Java 中,日期時間 API 存在諸多問題,其中有:

  • 非線程安全 − java.util.Date 是非線程安全的,所有的日期類都是可變的,這是Java日期類最大的問題之一。

  • 設計很差 − Java的日期/時間類的定義並不一致,在java.util和java.sql的包中都有日期類,此外用於格式化和解析的類在java.text包中定義。java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,將其納入java.sql包並不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設計。

  • 時區處理麻煩 − 日期類並不提供國際化,沒有時區支持,因此Java引入了java.util.Calendar和java.util.TimeZone類,但他們同樣存在上述所有的問題。

Java 8 在 java.time 包下提供了很多新的 API。以下爲兩個比較重要的 API:

  • Local(本地) − 簡化了日期時間的處理,沒有時區的問題。

  • Zoned(時區) − 通過制定的時區處理日期時間。

新的java.time包涵蓋了所有處理日期,時間,日期/時間,時區,時刻(instants),過程(during)與時鐘(clock)的操作。

實例:

        LocalDateTime now = LocalDateTime.now();
        System.out.println("當期dateTime爲:" + now);

        LocalDate localDate = now.toLocalDate();
        System.out.println("當前日期爲 :" + localDate);

        LocalTime localTime = now.toLocalTime();
        System.out.println(localTime);

具體新特性參考java8 API.



----------------------分隔符

以上僅作個人學習,如有侵權請聯繫刪除.謝謝

    結尾語:

     有志者、事竟成,破釜沉舟,百二秦關終屬楚;
  苦心人、天不負,臥薪嚐膽,三千越甲可吞吳。


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