日期時間類
Date類
注:以下介紹的Date都在java.util包下,除此之外,java.sql包下也有此類,不要混淆
構造方法
-
Date():分配Date對象並初始化此對象,以表示分配他的時間(精確到毫秒)
-
Date(long date):分配Date對象並初始化此對象,以表示自標准基准時間(即1970年1月1日00:00:00GMT)起指定毫秒數Date后的時間
使用第二種構造方法要先創建一個Date對象
//在此之前要導入Date類
import java.util.Date;
long t=System.currentTimeMillis();
Date date = new Date(t);
注:使用Date對象用的是long
Date類的常用方法和說明
方法 | 說明 |
---|---|
after(Date when) | 測試當前日期是否在指定日期之后 |
before(Date when) | 測試當前日期是否在指定日期之前 |
getTime() | 獲得自1970年1月1日00:00:00GMT起到現在所經過的毫秒數 |
setTime(long time) | 設置當前Date對象所表示的日期時間值,該值用以表示1970年1月1日00:00:00GMT以后time毫秒的時間點 |
獲取當前日期和時間
import java.util.Date;
public static void main(String[] args) {
Date date = new Date();
long value= date.getTime();//獲得毫秒數
System.out.println("日期:"+date);
System.out.println("到現在所經歷的毫秒數是:"+value);
}
/*
日期:Sat Sep 04 18:44:19 CST 2021
到現在所經歷的毫秒數是:1630752259575
*/
日期時間格式化(DateFormat類)
格式化風格有以下4種
(以2021年9月2日舉例)
SHORT:完全為數字
MEDIUM:較長
LONG:更長
FULL:完全指定
要格式化日期,首先要創建DateFormat對象,因為他是抽象類,所以可以用getDateInstance()進行創建
DateFormat d=DateFormat.getDateInstance();
此類常用方法和說明
方法 | 說明 |
---|---|
format() | 將一個Date對象實例格式化為日期/時間字符串 |
getCalendar() | 獲取於此日期/時間格式器關聯的日歷 |
getDateInstance() | 獲取日期格式器,該格式器具有默認語言環境的默認格式化風格 |
getDateTimeInstance() | 獲取日期/時間格式器,該格式器具有默認語言環境的默認格式化風格 |
getInstance() | 獲取為日期和時間使用SHORT風格的默認日期/時間格式器 |
getTimeInstance() | 獲取時間格式器,該格式器具有默認語言環境的默認格式化風格 |
parse(String source) | 將字符串解析成一個日期,並返回這個日期的Date對象 |
實例如下
import java.text.DateFormat;
import java.util.Date;
public static void main(String[] args) {
//將當前日期按照默認模式輸出
DateFormat d1=DateFormat.getInstance();
System.out.println(d1.format(new Date()));
//21-9-6 下午4:40
//輸出長類型格式的當前時間
DateFormat d2=DateFormat.getTimeInstance(DateFormat.LONG);
System.out.println(d2.format(new Date()));
//下午04時40分48秒
//輸出長類型格式的當前日期
DateFormat d3=DateFormat.getDateInstance(DateFormat.LONG);
System.out.println(d3.format(new Date()));
//2021年9月6日
//輸出長類型格式的當前時間和日期
DateFormat d4=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
System.out.println(d4.format(new Date()));
//2021年9月6日 下午04時40分48秒
}
因為DateFormat是一個抽象類,所以,除了使用getXXXInstance()方法創建對象,還可以用其子類,例如SimpleDateFormat類,此類提供了19個格式化字符,可以讓開發者隨意編寫日期格式
SimpleDateFormat類提供的格式化字符
字母 | 日期或時間元素 | 類型 | 示例 |
---|---|---|---|
G | Era標識志符 | Text | AD |
y | 年 | Year | 2021;21 |
M | 年中的月份 | Month | July;Jul;07 |
w | 年中的周數 | Number | 22 |
W | 月份中的周數 | Number | 3 |
D | 年中的天數 | Number | 56 |
d | 月份中的天數 | Number | 15 |
F | 月份中的星期 | Number | 3 |
E | 星期中的天數 | Text | Monday;Mon |
a | Am/pm標記 | Text | PM |
H | 一天中的小時數(0~23) | Number | 11 |
h | am/pm中的小時數(1~12) | Number | 2 |
k | 一天中的小時數(1~24) | Number | 22 |
K | am/pm中的小時數(0~11) | Number | 10 |
m | 小時中的分鍾數 | Number | 35 |
s | 分鍾中的秒數 | Number | 50 |
S | 毫秒數 | Number | 555 |
z | 時區 | General time zone | Pacific Standard Time;PST;GMT-08:00 |
Z | 時區 | RFC 822 time zone | -800 |
一般表中字母的數量會影響數字的格式,例如yyyy表示4位年份:2021,yy表示2位年份:21,y表示4位年份,如果超過4個y,則在左側補0,yyyyyy表示002021
常用時間格式
日期時間 | 對應的格式 |
---|---|
2021/9/6 | yyyy/MM/dd |
2021.9.6 | yyyy.MM.dd |
2021-09-06 17:42:50 | yyyy-MM-dd HH.mm.ss |
2021年9月6日 17時46分50秒 | yyyy年MM月dd日 HH時mm分ss秒 |
下午5時 | ah時 |
今年已經過去了200天 | 今年已經過去了D天 |
示例如下
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public static void main(String[] args) {
DateFormat d = new SimpleDateFormat("yyyy年MM月dd日 EEEE HH時mm分ss秒");
System.out.println("現在是:");
System.out.println(d.format(new Date()));
//2021年09月06日 星期一 17時51分17秒
}
Calendar類
Date在設計時並沒有考慮國際化,所以之中的方法並不能滿足當下需求,所以就有了Calendar類的出現,也是一個抽象類,該類提供了一些字段和方法,這些字段和方法被定義為protected。
該類提供了一個getIntance()方法,以獲得此類型的一個通用對象。Calendar類的getIntance()方法返回一個Calendar類對象,其日歷字段已由當前日期和時間初始化
import java.util.Calendar;
Calendar a=Calendar.getInstance();
此類提供的常用字段及其說明
字段名 | 說明 |
---|---|
DATE | 指示一個月中的某天 |
DAY_OF_MONTH | 指示一個月中的某天 |
DAY_OF_WEEK | 指示一個星期的某天 |
DAY_OF_WEEK_IN_MONTH | 指示當前月中的第幾個星期 |
DAY_OF_YEAR | 指示當前年中的天數 |
HOUR | 指示上午或下午的小時 |
HOUR_OF_DAY | 指示一天中的小時 |
MILLISECOND | 指示一秒中的毫秒 |
MINUTE | 指示一小時的分鍾 |
MONTH | 指示月份 |
SECOND | 指示一分鍾的秒 |
time | 日歷的當前設置時間,以毫秒為單位,表示自格林威治標准時間1970年1月1日0:00:00后經過的時間 |
WEEK_OF_MONTH | 指示當前月中的星期數 |
WEEK_OF_YEAR | 指示當前年中的星期數 |
YEAR | 指示年 |
此類提供的常用方法和說明
方法 | 說明 |
---|---|
add() | 根據日歷規則,為給定的日歷字段添加或減去指定的時間量 |
after() | 判斷此Calendar對象表示的時間是否在指定Object表示的時間之后,返回判斷結果 |
before() | 判斷此Calendar對象表示的時間是否在指定Object表示的時間之前,返回判斷結果 |
get() | 返回給定日歷字段的值 |
getInstance() | 使用默認時區和語言環境獲得一個日歷 |
getTime() | 返回一個表示此判斷此Calendar對象時間值(從歷元至現在的時間偏移量)的Date對象 |
getTimeInMillis() | 返回此判斷此Calendar對象的時間值,以毫秒為單位 |
roll() | 在給定的日歷時間段上添加或減去(上/下)單個時間單位,不更改更大的字段 |
set(int field,int value) | 將給定的日歷字段設置為給定值 |
set(int year,int month,int date) | 設置日歷字段YEAR,MONTH和DAY_OF_MONTH的值 |
set(int year,int month,int date,int hourOfDay,int minute) | 設置日歷字段YEAR,MONTH,DAY_OF_MONTH,HOUR_OF_DAY和MINUTE的值 |
set(int year,int month,int date,int hourOfDay,int minute,int second) | 設置日歷字段YEAR,MONTH,DAY_OF_MONTH,HOUR,MINUTE和SECOND的值 |
setTime() | 使用給定的Date對象設置此Calendar對象的值 |
setTimeInMillis() | 用給定的long值設置此Calendar對象的當前時間值 |
今天離中華人民共和國成立100周年差多少天
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public static void main(String[] args) {
System.out.println("----------中華人民共和國100周年倒計時----------");
Date date = new Date();
//創建SDF對象,設置日期格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//調用format方法,格式化時間並轉換為目標格式
String today=simpleDateFormat.format(date);
System.out.println("今天是"+today);//輸出當前日期
//獲取從1970年1月1日至當前所經歷的毫秒數
long time1= date.getTime();
//使用默認時區和語言環境獲得一個日歷
Calendar calendar=Calendar.getInstance();
//設置日歷中的年月日的值,因為月份是從0開始的,所以要減1
calendar.set(2049,10-1,1);
//計算自1970年1月1日到2049年10月1日所經過的毫秒數
long time2= calendar.getTimeInMillis();
//計算當前時間到2049年10月1日相差的時間
long day=(time2-time1)/(1000*60*60*24);
System.out.println("距離2049年10月1日還有"+day+"天");
}
注:
- c.(Calendar.DAY_OF_MONTH,0)獲取的是上個月的最后一天,所以調用前需要將月份往后加一個月
- Calendar.MONTH的第一個月是從0開始記錄的,所以在獲得月份數字后要加1。年和日是從1記錄的,不用加1
- Calendar.DAY-OF_WEEK的第一天是周日,第二天是周一,最后一天是周六
關於setTime
import java.util.Date;
Date date = new Date();
date.setTime(10000);//10000毫秒等於10秒
System.out.println(date);
//輸出Thu Jan 01 08:00:10 CST 1970
setTime(t)指的是經過從1970年1月1日8點開始經過t毫秒后的時間