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);