java date 操作类_JAVA时间操作类常用方法汇总
1、JAVA中日期的獲取、設置和格式化
(1)JAVA提供了3個日期類:Date、Calendar和DateFormat。
Date()方法主要用于創建日期對象并獲取日期;
Calendar()方法主要用于獲取和設置日期;
DateFormat()方法主要用于創建日期格式化器,然后再由格式化器將日期轉換為各種日期格式串輸出。
(2)JAVA語言規定的基準日期為格林尼治標準時間1970.1.1.00:00:00,當前日期是由基準日期開始所經歷的毫秒數轉換出來的。
(3)DateFomat類在java.text包中,Date和Calendar類在java.util包中。
(4)實例如下:import?java.util.*;?import?java.text.*;
public?class?DisplayDate?{
public?static?void?main(String[]?args){
Date?today;
Calendar?now;
DateFormat?f1,f2;
String?s1,s2;
System.out.println("\n顯示Date類的相關用法");
today?=?new?Date();?System.out.println("new?Date()=?\t"+?today);
System.out.println("\n用DateFormat類顯示各種日期格式");
//顯示各種日期格式
f1?=?DateFormat.getDateInstance();?s1?=?f1.format(today);
System.out.println("DateFormat.getDateInstance()=?\t"+s1);
f1?=?DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);
s1?=?f1.format(today);
System.out.println("DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)=
\t"+?s1);
f1?=?DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);
s1?=?f1.format(today);
System.out.println("DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)=?\t"+?s1);
f1?=?DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA);
s1?=?f1.format(today);
System.out.println("DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)=
\t"?+?s1);
System.out.println("\n用DateFormat類顯示各種時間格式");
//顯示各種時間格式
f1?=?DateFormat.getTimeInstance();
s1?=?f1.format(today);
System.out.println("DateFormat.getTimeInstance()=?\t"+s1);
f1?=?DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA);
s1?=?f1.format(today);
System.out.println("DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)=
\t"+s1);
f1?=?DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);
s1?=?f1.format(today);
System.out.println("DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)=?\t"+s1);
f1?=?DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA);
s1?=?f1.format(today);
System.out.println("DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)=?\t"+s1);
System.out.println("\n顯示Calendar的相關時間用法");
now?=?Calendar.getInstance();?today?=?now.getTime();
System.out.println("Calendar.getInstance().getTime()=?\t"+
today.toString());
}
}
程序運行結果顯示如下:
顯示Date類的相關用法
new Date()= Fri May 02 13:29:32 CST 2003
用DateFormat類顯示各種日期格式
DateFormat.getDateInstance()= 2003-5-2
DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)= 2003年5月2日
DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= 2003-5-2
DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)= 03-5-2
用DateFormat類顯示各種時間格式
DateFormat.getTimeInstance()= 13:29:32
DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)= 下午01時29分32秒
DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= 13:29:32
DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= 下午1:29
顯示Calendar的相關時間用法
Calendar.getInstance().getTime()= Fri May 02 13:29:33
CST 2003
2、SimpleDateFormat1. SimpleDateFormat 介紹????????SimpleDateFormat 是DateFormat的子類,一個格式化Date 以及 解析日期字符串 的工具。它的最常用途是,能夠按照指定的格式來對Date進行格式化,然后我們使用可以格式化Date后得到的字符串。
更嚴格的說,SimpleDateFormat 是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文本)、解析(文本 -> 日期)和規范化。
SimpleDateFormat的構造函數:
構造函數SimpleDateFormat()
SimpleDateFormat(String?pattern)
SimpleDateFormat(String?template,?DateFormatSymbols?value)
SimpleDateFormat(String?template,?Locale?locale)
非構造函數void????applyLocalizedPattern(String?template)
void????applyPattern(String?template)
Object????clone()
boolean????equals(Object?object)
StringBuffer????format(Date?date,?StringBuffer?buffer,?FieldPosition?fieldPos)
AttributedCharacterIterator????formatToCharacterIterator(Object?object)
Date????get2DigitYearStart()
DateFormatSymbols????getDateFormatSymbols()
int????hashCode()
Date????parse(String?string,?ParsePosition?position)
void????set2DigitYearStart(Date?date)
void????setDateFormatSymbols(DateFormatSymbols?value)
String????toLocalizedPattern()
String????toPattern()
SimpleDateFormat 簡單示范://?新建date對象,時間是2013-09-19
Date?date?=?new?Date(113,8,19);
//?新建“SimpleDateFormat對象”,并設置?sdf?的“格式化模式”
SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd");
//?用?sdf?格式化?date,并返回字符串。
String?str?=?sdf.format(date);
2. SimpleDateFormat 相關格式說明
2.1 日期和時間模式????????日期和時間格式由日期和時間模式 字符串指定。在日期和時間模式字符串中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被解釋為模式字母,用來表示日期或時間字符串元素。文本可以使用單引號 (') 引起來,以免進行解釋。"''" 表示單引號。所有其他字符均不解釋;只是在格式化時將它們簡單復制到輸出字符串,或者在解析時與輸入字符串進行匹配。
定義了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):字母日期或時間元素表示示例GEra 標志符TextAD
y年Year1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周數Number27
W月份中的周數Number2
D年中的天數Number189
d月份中的天數Number10
F月份中的星期Number2
E星期中的天數TextTuesday; Tue
aAm/pm 標記TextPM
H一天中的小時數(0-23)Number0
k一天中的小時數(1-24)Number24
Kam/pm 中的小時數(0-11)Number0
ham/pm 中的小時數(1-12)Number12
m小時中的分鐘數Number30
s分鐘中的秒數Number55
S毫秒數Number978
z時區General time zonePacific Standard Time; PST; GMT-08:00
Z時區RFC 822 time zone-0800
模式字母通常是重復的,其數量確定其精確表示:
Text: 對于格式化來說,如果模式字母的數量大于等于 4,則使用完全形式;否則,在可用的情況下使用短形式或縮寫形式。對于解析來說,兩種形式都是可接受的,與模式字母的數量無關。
Number: 對于格式化來說,模式字母的數量是最小的數位,如果數位不夠,則用 0 填充以達到此數量。對于解析來說,模式字母的數量被忽略,除非必須分開兩個相鄰字段。
Year: 如果格式器的 Calendar 是格里高利歷,則應用以下規則。
Month: 如果模式字母的數量為 3 或大于 3,則將月份解釋為 text;否則解釋為 number。
對于格式化來說,如果模式字母的數量為 2,則年份截取為 2 位數,否則將年份解釋為 number。
對于解析來說,如果模式字母的數量大于 2,則年份照字面意義進行解釋,而不管數位是多少。因此使用模式 "MM/dd/yyyy",將 "01/11/12" 解析為公元 12 年 1 月 11 日。
在解析縮寫年份模式("y" 或 "yy")時,SimpleDateFormat 必須相對于某個世紀來解釋縮寫的年份。這通過將日期調整為 SimpleDateFormat 實例創建之前的 80 年和之后 20 年范圍內來完成。例如,在 "MM/dd/yy" 模式下,如果 SimpleDateFormat 實例是在 1997 年 1 月 1 日創建的,則字符串 "01/11/12" 將被解釋為 2012 年 1 月 11 日,而字符串 "05/04/64" 將被解釋為 1964 年 5 月 4 日。在解析時,只有恰好由兩位數字組成的字符串(如 Character#isDigit(char) 所定義的)被解析為默認的世紀。其他任何數字字符串將照字面意義進行解釋,例如單數字字符串,3 個或更多數字組成的字符串,或者不都是數字的兩位數字字符串(例如"-1")。因此,在相同的模式下, "01/02/3" 或 "01/02/003" 解釋為公元 3 年 1 月 2 日。同樣,"01/02/-3" 解析為公元前 4 年 1 月 2 日。
否則,則應用日歷系統特定的形式。對于格式化和解析,如果模式字母的數量為 4 或大于 4,則使用日歷特定的 long form。否則,則使用日歷特定的 short or abbreviated form。
SimpleDateFormat 還支持本地化日期和時間模式 字符串。在這些字符串中,以上所述的模式字母可以用其他與語言環境有關的模式字母來替換。SimpleDateFormat 不處理除模式字母之外的文本本地化;而由類的客戶端來處理。
示例
以下示例顯示了如何在美國語言環境中解釋日期和時間模式。給定的日期和時間為美國太平洋時區的本地時間 2001-07-04 12:08:56。日期和時間模式結果"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700
日期格式是不同步的。建議為每個線程創建獨立的格式實例。如果多個線程同時訪問一個格式,則它必須是外部同步的。
3、部分方法實例
1.Calendar和Date的轉化(1) Calendar轉化為DateCalendar?cal=Calendar.getInstance();
Date?date=cal.getTime();
(2) ?Date轉化為CalendarDate?date=new?Date();
Calendar??cal=Calendar.getInstance();
cal.setTime(date);
2.格式化輸出日期時間及將日期轉換為字符串Date?date=new?Date();
SimpleDateFormat??df=new?SimpleDateFormat("yyyy-MM-dd?hh:mm:ss");
System.out.println(df.format(date));
String?dateStr?=?"2017-01-01?18:00:00";
SimpleDateFormat?df24?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss");
System.out.println(df24.parse(dateStr));
3.計算某一月份的最大天數Calendar
time=Calendar.getInstance();
time.clear();
time.set(Calendar.YEAR,year);
time.set(Calendar.MONTH,i-1);//注意,Calendar對象默認一月為0
int
day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數
注:在使用set方法之前,必須先clear一下,否則很多信息會繼承自系統當前時間
4.計算一年中的第幾星期
(1)計算某一天是一年中的第幾星期Calendar?cal=Calendar.getInstance();
cal.set(Calendar.YEAR,?2006);
cal.set(Calendar.MONTH,?8);
cal.set(Calendar.DAY_OF_MONTH,?3);
int?weekno=cal.get(Calendar.WEEK_OF_YEAR);
(2)計算一年中的第幾星期是幾號SimpleDateFormat?df=new?SimpleDateFormat("yyyy-MM-dd");
Calendar?cal=Calendar.getInstance();
cal.set(Calendar.YEAR,?2006);
cal.set(Calendar.WEEK_OF_YEAR,?1);
cal.set(Calendar.DAY_OF_WEEK,?Calendar.MONDAY);
System.out.println(df.format(cal.getTime()));
//輸出:?2006-01-02
5.add()和roll()的用法
(1)add()方法SimpleDateFormat?df=new?SimpleDateFormat("yyyy-MM-dd");
Calendar?cal=Calendar.getInstance();
cal.set(Calendar.YEAR,?2006);
cal.set(Calendar.MONTH,?8);??//MONTH是從0開始計的,這里輸出是9月
cal.set(Calendar.DAY_OF_MONTH,?3);
cal.add(Calendar.DATE,?-4);
Date?date=cal.getTime();
System.out.println(df.format(date));
cal.add(Calendar.DATE,?4);
date=cal.getTime();
System.out.println(df.format(date));
//輸出:2006-08-30
//輸出:2006-09-03
(2)roll方法cal.set(Calendar.YEAR,?2006);
cal.set(Calendar.MONTH,?8);
cal.set(Calendar.DAY_OF_MONTH,?3);
cal.roll(Calendar.DATE,?-4);
date=cal.getTime();
System.out.println(df.format(date));
cal.roll(Calendar.DATE,?4);
date=cal.getTime();
System.out.println(df.format(date));
//輸出:2006-09-29
//輸出:2006-09-03
可見,roll()方法在本月內循環,一般使用add()方法;
6.計算兩個任意時間中間的間隔天數????????(1)傳進Calendar對象/*
*?計算兩個時間之間相隔天數
*?@param?startday?開始時間
*?@param?endday?結束時間
*?@return
*/
public?int?getIntervalDays(Calendar?startday,Calendar?endday){
//確保startday在endday之前
if(startday.after(endday)){
Calendar?cal=startday;
startday=endday;
endday=cal;
}
//分別得到兩個時間的毫秒數
long?sl=startday.getTimeInMillis();
long?el=endday.getTimeInMillis();
long?ei=el-sl;
//根據毫秒數計算間隔天數
return?(int)(ei/(1000*60*60*24));?}
(2)傳進Date對象/*
*計算兩個時間之間相隔天數
*?@param?startday?開始時間
*?@param?endday?結束時間
*?@return
*/
public?int?getIntervalDays(Date?startday,Date?endday){
//確保startday在endday之前
if(startday.after(endday)){
Date?cal=startday;
startday=endday;
endday=cal;
}
//分別得到兩個時間的毫秒數
long?sl=startday.getTime();
long?el=endday.getTime();
long?ei=el-sl;
//根據毫秒數計算間隔天數
return?(int)(ei/(1000*60*60*24));
}
//同理,可以用相同的方法計算出任意兩個時間相隔的小時數,分鐘數,秒鐘數等?注:以上方法是完全按時間計算,有時并不能令人滿意,如:
startday="2006-10-11?20:00:00"
endday="2006-10-12?8:00:00"
//計算結果為0,但是我們也許相讓計算結果變為1,此時可以用如下方法實現:?在傳參之前,先設定endday的時間,如:
endday.set(Calendar.HOUR_OF_DAY,?23);
endday.set(Calendar.MINUTE,?59);
endday.set(Calendar.SECOND,?59);
endday.set(Calendar.MILLISECOND,?59);
//這樣再傳進去startday,endday,則結果就如我們所愿了。不過,如果嫌以上方法麻煩,可以參考以下方法:
(3)改進精確計算相隔天數的方法public?int?getDaysBetween?(Calendar?d1,?Calendar?d2)?{
if?(d1.after(d2))?{
//?swap?dates?so?that?d1?is?start?and?d2?is?end
java.util.Calendar?swap?=?d1;
d1?=?d2;
d2?=?swap;
}
int?days?=?d2.get(Calendar.DAY_OF_YEAR)?-?d1.get(Calendar.DAY_OF_YEAR);??????????????????int?y2?=?d2.get(Calendar.YEAR);
if?(d1.get(Calendar.YEAR)?!=?y2)?{
d1?=?(Calendar)?d1.clone();
do?{
days?+=?d1.getActualMaximum(Calendar.DAY_OF_YEAR);
//得到當年的實際天數
d1.add(Calendar.YEAR,?1);
}?while?(d1.get(Calendar.YEAR)?!=?y2);
}
return?days;
}
總結
以上是生活随笔為你收集整理的java date 操作类_JAVA时间操作类常用方法汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java wcf 未提供用户名_WCF安
 - 下一篇: java sqlldr导入_使用SQL*