Java基礎——與時間相關的類

來自:https://www.cnblogs.com/caoyc/p/4546527.html

           https://www.cnblogs.com/fulitaiblogs/p/3763155.html

一、Data及其常用API

1、簡介

  Java中的時間使用標準類庫的java.util.Date,其表示特定的瞬間,精確到毫秒。是用距離一個固定時間點的毫秒數(可正可負,long類型)表達一個特定的時間點。

固定的時間點叫紀元(epoch),是UTC時間1970年 1月 1日 00:00:00  ,UTC(Universal Time Coordinated世界調整時間)與GMT(Greenwich Mean Time格林威治時間)一樣,是一種具有實際目的的科學標準時間。

  因爲Date的設計具有"千年蟲"以及"時區"的問題,所以Date中的大部分方法已經不建議使用了,它們都被java.util.Calendar類所取代,該類我們稍後會講解。

2、構造函數

  ①:new Date() :返回系統當前時間的Date對象

  ②:new Date(long date):給定指定毫秒數,返回Date對象

  ③:new Date(int year, int month,int date) :根據年月日返回Date對象

     注意:year:107表示2007年   年份=1900+year   。例如要表示2015年,則year=2015-1900=115

             month:0表示1月        月份=month+1     。例如要表示6月,則month=6-1=5 。如果月份大於11會產生向年份進位。

      date:日如果大於該月的最大值時,同樣會向月進位

  ④:new Date(int year,int  month,int  date,int  hrs,int  min)

  ⑤:new Date(int year,int  month,int  date,int  hrs,int  min,int  sec)

      注意:時分秒同樣也會產生進位

3、常用方法

  ①:setTime(long time) 設置一個時間,long表示的這個時間點距離1970年1月1日 00:00:00之間的毫秒差。

  ②:getTime():獲取該時間距離1970年1月1日 00:00:00之間的毫秒差

 

二、SimpleDateFormat

1、簡介

  SimpleDateFormat 是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文本)、解析(文本 -> 日期)和規範化。

 

2、日期模式匹配字符串

字符 含義 示例
y yyyy年---2015年
M MM月--03月
d dd日--12日
E 星期 E--星期日
a 上下午 a--上午(AM)
H 24小時制 HH時--16時
h 12小時制 hh時--04時
m mm--23分
s ss--59秒
S 毫秒 SSS毫秒-567毫秒

  例如yyyy-MM-dd HH:mm:ss.SSS可以匹配2015-06-02 14:32:13.546

 

3、將Date轉換成String

Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(sdf.format(date)); 

 

4、將String轉換成Date

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date =sdf.parse("2015-06-02 14:35:36.000");
System.out.println(date); 

 

三、Calendar類

1、簡介

  java.util.Calendar 類用於封裝日曆信息,其主要作用在於其方法可以對時間分量進行運算。

Calendar是抽象類,其具體子類針對不同國家的日曆系統,其中應用最廣泛的是GregorianCalendar(格里高裏歷,即通用的陽曆),對應世界上絕大多數國家/地區使用的標準日曆系統。

2、 getInstance()方法

Calendar是抽象類,其提供了一個工廠方法:Calendar getInstance()。該方法可以根據當前系統所在地區獲取一個適當的Calendar的子類實現。

在實際開發中,也推薦使用該方法來實例化Calendar的對象。

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar calendar=Calendar.getInstance();
System.out.println(sdf.format(calendar.getTime()));

3、設置日期及時間分量

  Calendar提供了一種通用的設置時間的方式:

  void set(int field,int value)

  該方法可以通過對不同的時間分量分別設置不同的值。Calendar對不同的時間分量提供了相應的常量,我們在使用set方法設置時,第一個參數就應當使用對應的常量作爲時間分量。

  注意:分量month同樣從0開始,分量也有進位的可能

4、setTime與getTime

  設置和獲取的對象都是Data類型,而Date對象對應的這兩個方法,是long類型的

5、void add(int field,int amount)

  該方法可以爲某個時間分量的值加上給定的值,若想減去給定的值,那麼傳入的值需要時負數即可。並且計算後會自動進行相應的進位。

6、int  getActualMaximum(int field)

  獲取該分量的最大值

四、sql包下的時間類

 

爲什麼要有java.sql.Date這個類呢?

我們發現除了父類Date在util包下,它的三個子類都是在sql包下的。因爲在和數據庫打交道時(也就是在執行sql語句時),我們要用到sql包下的時間類,其他情況下我們通常用util包下的Date來格式化日期或者得到當前時間。爲什麼和數據庫打交道時不能用java.util.Date?因爲PreparedStatement有三個設置時間的方法:setDate()、setTime()、setTimeStamp(),這三個方法的第二個參數分別是java.sql.Date、java.sql.Time和java.sql.TimeStamp,並沒有提供參數是java.util.Date的方法。除此之外,ResultSet也有三個get()方法與之對應,且返回的時間類型也是sql包下的這三個類。


java.sql.Date日期格式爲:年月日
java.sql.Time日期格式爲:時分秒 
java.sql.Timestamp日期格式爲:年月日時分秒納秒(毫微秒)

 java.sql.Date類

(1)getTime方法返回毫秒數

(2)互相轉換

new java.sql.Date(new java.util.Date().getTime())

new java.util.Date(new java.sql.Date(0).getTime())

五、利用以上各個類的功能,我們可以很簡單的實現一些時間計算的功能,下面看幾個方法:

  l、判斷是否是閏年

    /**

     * 給定一個年份判斷該年份是否爲閏年

     */

    public static boolean isLeapYear(int year) {

       GregorianCalendar calendar = new GregorianCalendar();

       return calendar.isLeapYear(year);

    }

 

  2、獲取當前日期的字符串表示形式

    /**

     * 利用SimpleDateFormat獲取當前日期的字符串表示形式 格式:2009-5-05

     */

    public static String getCurrentDate() {

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       return dateFormat.format(System.currentTimeMillis());

    }

 

  3、給出任意一個年月日得到該天是星期幾

    /**

     * 給出任意一個年月日得到該天是星期幾

     */

    public static int getWeek(String date) {

       // 注意參數的大小寫格式

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       Calendar c = Calendar.getInstance();

       try {

           Date d = dateFormat.parse(date);

           c.setTime(d);

       } catch (ParseException e) {

       }

       return c.get(Calendar.DAY_OF_WEEK)-1;

    }

 

  4、 獲得今天n天以後或者n天以前是那一天

    /**

     * 獲得距離今天n天的那一天的日期

     */

    public static String getDistanceDay(int day) {

       Calendar calen = Calendar.getInstance();

       calen.add(Calendar.DAY_OF_MONTH, day);

       Date date = calen.getTime();

       // 這裏也個用SimpleDateFormat的format()進行格式化,然後以字符串形式返回格式化後的date

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       return dateFormat.format(date);

}

 

  5、 獲得距離指定日期n天的那一天的日期

    /**

     * 獲得距離指定日期n天的那一天的日期

     */

    public static String getDistanceDay(String date, int day) {

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

       Date d;

       Calendar c =Calendar.getInstance();

       try {

           d = dateFormat.parse(date);

           c.setTime(d);

           c.add(Calendar.DATE, day);

 

       } catch (ParseException e) {

           e.printStackTrace();

       }

       return dateFormat.format(c.getTime());

    }

 

  6、獲得給定兩個日期相差的天數

    /**

     * 獲得給定兩個日期相差的天數

     *

     */

    public static long getGapDays(String date1, String date2) {

       String[] d1 = date1.split("-");

       String[] d2 = date2.split("-");

       Calendar c = Calendar.getInstance();

       c.set(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer

              .parseInt(d1[2]), 0, 0, 0);

       long l1 = c.getTimeInMillis();

       c.set(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer

              .parseInt(d2[2]), 0, 0, 0);

       long l2 = c.getTimeInMillis();

       return (Math.abs(l1 - l2) / (24 * 60 * 60 * 1000));

    }

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