1. 程式人生 > >java中的時間和日期類

java中的時間和日期類

日期、時間類

Date類
java8中的構造器,之前有六個但是其餘四個已經不推薦使用了。

構造器 功能
Date() 生成一個代表當前日期時間的Date物件
Date(long date) 根據指定的long整形數來生成一個Date物件,該構造器的引數表示與計算機元年之間的時間差,以毫秒計

大部分方法也不被推薦,只剩下幾個方法:

方法 描述
boolean after(Date when)
測試該日期是否在指定日期when之後
boolean before(Date when) 測試該日期是否在指定日期when之前
long getTime() 返回該時間對應的long型整數,從計算機元年到Date物件之間的時間差,以毫秒計
void setTime(long time) 設定該物件的時間
public static void main(String[] args) {
        Date d1 = new Date();

        //獲取當前系統的毫秒值
        System.out.println(d1.getTime());//1540796552553

        //設定系統時間
        d1.setTime(58298265);
        System.out.println(d1);//Fri Jan 02 00:11:38 CST 1970

        //獲取當前時間之後100ms的時間
        Date d2 = new Date(System.currentTimeMillis() + 100);
        System.out.println(d2);//Mon Oct 29 14:57:23 CST 2018
        System.out.println(d1.compareTo(d2));//-1
        System.out.println(d1.before(d2));//true
    }

日期與毫秒的轉換

public static void main(String[] args) {
        //Date---- long 的轉換
        long time = new Date().getTime();//1540796704636
        System.out.println(time);
        //long----date
        Date date = new Date(1540796686252L);//Mon Oct 29 15:04:46 CST 2018
        System.out.println(date);

    }

Calendar日曆類

什麼是Calender類?
彌補了Date類的缺陷的一個表示日曆的抽象類。不能直接例項化,程式只能建立calender子類的例項。

與Date類的相互轉換

public static void main(String[] args) {
        //建立一個預設的Calendar物件
        Calendar cl = Calendar.getInstance();

        //從Calender物件中取出Date物件
        Date date = cl.getTime();

        //通過Date物件獲取Calendar物件
        Calendar cl2 = Calendar.getInstance();
        cl2.setTime(date);
    }

Calender類提供了大量訪問、修改日期的方法,常用方法:

        //建立一個預設的Calendar物件
        Calendar cl = Calendar.getInstance();
        System.out.println(cl);
        //物件返回這些資訊可通過指定欄位呼叫
        /*java.util.GregorianCalendar[time=1540797473633,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=2018,MONTH=9,WEEK_OF_YEAR=44,
        WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=302,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=5,
        AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=17,SECOND=53,MILLISECOND=633,ZONE_OFFSET=28800000,DST_OFFSET=0]
         */
  • void add(int field,int amount):為給定日曆欄位新增或減去指定的時間量;
        //獲取指定欄位的值
        System.out.println(cl.get(Calendar.YEAR));//2018
        System.out.println(cl.get(Calendar.MONTH));//9
        System.out.println(cl.get(Calendar.WEEK_OF_YEAR));//一年中的第幾周 44
        System.out.println(cl.get(Calendar.DAY_OF_MONTH));//一個月的第幾天 29
        System.out.println(cl.get(Calendar.DAY_OF_WEEK));//一週的第幾天   2
        System.out.println(cl.get(Calendar.DAY_OF_WEEK_IN_MONTH));//這個月的第幾周  5
  • int get(int field):返回指定日曆欄位的值;
        //給指定欄位的值新增
        cl.add(Calendar.YEAR,3);
        System.out.println(cl.getTime());//Fri Oct 29 15:23:25 CST 2021
  • int getActualMaximum(int field):返回指定日曆欄位可能擁有的最大值。
        //從0開始計
        System.out.println(cl.getActualMaximum(Calendar.YEAR));
        System.out.println(cl.getActualMaximum(Calendar.MONTH));//11個月
        System.out.println(cl.getActualMaximum(Calendar.HOUR));//11小時
        System.out.println(cl.getActualMaximum(Calendar.MINUTE));//59分鐘
  • int getActualMininum(int field):返回指定日曆欄位可能擁有的最小值;
  • void roll(int field,int amount):與add方法類似,區別在於加上amount後超過了該欄位所能表示範圍時不會向上一個欄位進位。
  • void set(int field,int value):將給定日曆欄位設定為給定值;
  • void set(int year,int month,int date):設定Calendar物件的年、月、日三個欄位的值;
  • void set(int year,int month,int date,int hourOfDay,int minute,int second):設定Calendar物件的年、月、日、時、分、秒六個欄位的值;

add和roll的區別

        Calendar cal3 = Calendar.getInstance();
        cal3.set(2003,7,23,0,0,0);
        //不想上進位,年份不變1
        cal3.roll(Calendar.MONTH,6);//Sun Feb 23 00:00:00 CST 2003
        System.out.println(cal3.getTime());

        Calendar cal4 = Calendar.getInstance();
        cal4.set(2003,7,31,0,0,0);
        //MONTH欄位進位後變成2,2月沒有31
        cal4.add(Calendar.MONTH,-6);
        System.out.println(cal4.getTime());//Fri Feb 28 00:00:00 CST 2003

set的容錯性
Calendar提供了一個setLenient()用於設定它的容錯性,
比如設定月份為13。

        Calendar  cal= Calendar.getInstance();
        cal.set(Calendar.MONTH,13);
        System.out.println(cal.getTime());//Fri Mar 01 15:50:07 CST 2019

        //關閉容錯性,預設是開啟的
        cal.setLenient(false);
        cal.set(Calendar.MONTH,13);
        System.out.println(cal.getTime());
        //Exception in thread "main" java.lang.IllegalArgumentException: MONTH

可以看到第一段程式碼執行正常,關閉容錯性後,將不能設定不合法的欄位值,否則會丟擲異常。

set方法延遲修改

set(f,value)方法將日曆欄位f更改為value,此外他還設定了一個內部成員變數,以指示日曆欄位f已經被更改。儘管日曆欄位是更改的,但該Calendar所代表的時間且不會立即更改,直到下次呼叫get()、getTime、getTimeInMillis、add或roll時才會重新計算日曆時間,被稱為set方法的延遲修改,這種機制的優勢是如果多次修改,不會出發所賜不必要的計算。

日期格式化類SimpleDateFormat

        SimpleDateFormat format = new SimpleDateFormat();

        //把當前日期格式化成一個日期字串
        String date=format.format(new Date());
        System.out.println(date);//預設格式18-11-1 下午6:58

還可以自定義輸出的時間格式

  • y:年
  • M:月
  • d:天
  • H:時
  • m:分
  • s:秒
  • E:星期
        //自定義格式
        SimpleDateFormat simp= new SimpleDateFormat("yyyy年MM月dd號 HH點mm分ss秒 E z");
        String format1=simp.format(new Date());//2018年11月01號 19點05分18秒 星期四 CST
        System.out.println(format1);

將字串解析成日期物件
注意格式對應

        String dateStr="2018-10-10 10:30:30";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date=simpleDateFormat.parse(dateStr);//可能會產生異常 ParseException 異常丟擲
        System.out.println(date);//Wed Oct 10 10:30:30 CST 2018

Java8新增的日期、時間包

Clock:該類用於獲取指定時區的當前日期、時間。

        //獲取當前Clock
        Clock clock=Clock.systemUTC();

        //獲取當前時刻
        System.out.println(clock.instant());
        //2018-11-01T12:07:16.234Z
        
        //獲取對應毫秒數
        System.out.println(clock.millis());
        //1541074036373

Duration:代表持續時間,該類可以方便地獲取一段時間;

        Duration d=Duration.ofSeconds(6000);
        System.out.println("6000秒相當於"+d.toMinutes()+"分");
        System.out.println("6000秒相當於"+d.toHours()+"小時");
        System.out.println("6000秒相當於"+d.toDays()+"天");
        System.out.println("6000秒相當於"+d.toMillis()+"毫秒");
        System.out.println("6000秒相當於"+d.toNanos()+"納秒");

Instant:代表一個具體的時刻,可以精確到納秒;

        //獲取當前時間
        Instant instant=Instant.now();
        System.out.println(instant);

        //instant新增6000秒,返回新的Instant
        Instant instant2=instant.plusSeconds(6000);
        System.out.println(instant2);

        //根據字串解析Instant物件
        Instant instant3=Instant.parse("2018-11-01T14:10:56.812Z");
        System.out.println(instant3);

        //在instant3上新增5小時4分鐘
        Instant instant4=instant3.plus(Duration.ofHours(5).plusMinutes(4));
        System.out.println(instant4);

        //獲取Instant4五天之前的時間
        Instant instant5=instant4.minus(Duration.ofDays(5));
        System.out.println(instant5);

LocalDate:該類代表不帶時區的日期;

        LocalDate localDate=LocalDate.now();
        System.out.println(localDate);//2018-11-01
        //獲取2018年的第188天
        localDate=LocalDate.ofYearDay(2018,188);
        System.out.println(localDate);//2018-07-07

        //設定為2018年5月21日
        localDate=LocalDate.of(2018,5,21);
        System.out.println(localDate);

LocalTime:代表不帶時區的時間;
同上
LocalDateTime:代表不帶時區的日期和時間;
同上
MonthDay:僅代表月日;
Year:該類僅代表年;

YearMonth:代表年月;
ZoneDateTime:代表一個時區化日期、時間;
Zoneld:代表一個時區;
DayOfWeek:這是一個列舉類,定義了週日到週六的列舉值;
Month:定義了一月到十二月的列舉值;

        //獲取當年分
        Year year=Year.now();
        //再加5年
        year=year.plusYears(5);
        
        //根據指定月份獲取YearMonth
        YearMonth ym=year.atMonth(10);
        
        MonthDay md=MonthDay.now();
        //設定5月23日
        MonthDay md2=md.with(Month.MAY).withDayOfMonth(23);