老實(shí)說(shuō)對(duì)于時(shí)間的處理我大部分都在用Calendar日歷類解決,現(xiàn)在整理一下,方便以后開(kāi)發(fā)查閱
java.util
類 Calendar
java.lang.Object
繼承者 java.util.Calendar
所有已實(shí)現(xiàn)的接口:
Serializable, Cloneable, Comparable<Calendar>
直接已知子類:
GregorianCalendar
public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
1. Calendar類
首先先創(chuàng)建一個(gè)Calendar實(shí)例:Calendar instance Calendar.getInstance();
,其中返回的具體類類型就是Calendar的子類GregorianCalendar的對(duì)象,所以使用時(shí)也可以直接new GregorianCalendar()
在下文的演示當(dāng)中都會(huì)用instance作為Calendar的一個(gè)實(shí)例.
Calendar類的成員變量:
這里以下所說(shuō)的get,set方法指的是instance的get,set方法
static int ALL_STYLES
指示所有風(fēng)格名稱的 getDisplayNames 的風(fēng)格說(shuō)明符叁温,比如 "January" 和 "Jan"。
static int AM
指示從午夜到中午之前這段時(shí)間的 AM_PM 字段值。
static int AM_PM
get 和 set 的字段數(shù)字,指示 HOUR 是在中午之前還是在中午之后。
static int APRIL
指示在格里高利歷和羅馬儒略歷中一年中第四個(gè)月的 MONTH 字段值门烂。
protected boolean areFieldsSet
如果 fields[] 與當(dāng)前的設(shè)置時(shí)間同步宙枷,則返回 true钙畔。
static int AUGUST
指示在格里高利歷和羅馬儒略歷中一年中第八個(gè)月的 MONTH 字段值甚疟。
static int DATE
get 和 set 的字段數(shù)字,指示一個(gè)月中的某天逃延。
static int DAY_OF_MONTH
get 和 set 的字段數(shù)字览妖,指示一個(gè)月中的某天。
static int DAY_OF_WEEK
get 和 set 的字段數(shù)字揽祥,指示一個(gè)星期中的某天讽膏。
static int DAY_OF_WEEK_IN_MONTH
get 和 set 的字段數(shù)字,指示當(dāng)前月中的第幾個(gè)星期拄丰。
static int DAY_OF_YEAR
get 和 set 的字段數(shù)字府树,指示當(dāng)前年中的天數(shù)俐末。
static int DECEMBER
指示在格里高利歷和羅馬儒略歷中一年中第十二個(gè)月的 MONTH 字段值。
static int DST_OFFSET
get 和 set 的字段數(shù)字奄侠,以毫秒為單位指示夏令時(shí)的偏移量卓箫。
static int ERA
指示年代的 get 和 set 的字段數(shù)字,比如羅馬儒略歷中的 AD 或 BC垄潮。
static int FEBRUARY
指示在格里高利歷和羅馬儒略歷中一年中第二個(gè)月的 MONTH 字段值烹卒。
static int FIELD_COUNT
get 和 set 可識(shí)別的不同字段的數(shù)量。
protected int[] fields
此日歷當(dāng)前設(shè)置時(shí)間的日歷字段值弯洗。
static int FRIDAY
指示 Friday 的 DAY_OF_WEEK 字段值旅急。
static int HOUR
get 和 set 的字段數(shù)字,指示上午或下午的小時(shí)牡整。
static int HOUR_OF_DAY
get 和 set 的字段數(shù)字藐吮,指示一天中的小時(shí)。
protected boolean[] isSet
通知是否設(shè)置了該日歷某一指定日歷字段的標(biāo)志逃贝。
protected boolean isTimeSet
如果 time 值是一個(gè)有效值谣辞,則返回 true。
static int JANUARY
指示在格里高利歷和羅馬儒略歷中一年中第一個(gè)月的 MONTH 字段值秋泳。
static int JULY
指示在格里高利歷和羅馬儒略歷中一年中第七個(gè)月的 MONTH 字段值潦闲。
static int JUNE
指示在格里高利歷和羅馬儒略歷中一年中第六個(gè)月的 MONTH 字段值。
static int LONG
指示長(zhǎng)名稱的 getDisplayName 和 getDisplayNames 的風(fēng)格說(shuō)明符迫皱,比如 "January"歉闰。
static int MARCH
指示在格里高利歷和羅馬儒略歷中一年中第三個(gè)月的 MONTH 字段值。
static int MAY
指示在格里高利歷和羅馬儒略歷中一年中第五個(gè)月的 MONTH 字段值卓起。
static int MILLISECOND
get 和 set 的字段數(shù)字和敬,指示一秒中的毫秒。
static int MINUTE
get 和 set 的字段數(shù)字戏阅,指示一小時(shí)中的分鐘昼弟。
static int MONDAY
指示 Monday 的 DAY_OF_WEEK 字段值。
static int MONTH
指示月份的 get 和 set 的字段數(shù)字奕筐。"這里有非常需要注意的一點(diǎn),這里顯示的月份是由0開(kāi)始的"
static int NOVEMBER
指示在格里高利歷和羅馬儒略歷中一年中第十一個(gè)月的 MONTH 字段值舱痘。
static int OCTOBER
指示在格里高利歷和羅馬儒略歷中一年中第十個(gè)月的 MONTH 字段值。
static int PM
指示從中午到午夜之前這段時(shí)間的 AM_PM 字段值离赫。
static int SATURDAY
指示 Saturday 的 DAY_OF_WEEK 字段值芭逝。
static int SECOND
get 和 set 的字段數(shù)字,指示一分鐘中的秒渊胸。
static int SEPTEMBER
指示在格里高利歷和羅馬儒略歷中一年中第九個(gè)月的 MONTH 字段值旬盯。
static int SHORT
指示短名稱的 getDisplayName 和 getDisplayNames 的風(fēng)格說(shuō)明符,比如 "Jan"。
static int SUNDAY
指示 Sunday 的 DAY_OF_WEEK 字段值胖翰。
static int THURSDAY
指示 Thursday 的 DAY_OF_WEEK 字段值接剩。
protected long time
日歷的當(dāng)前設(shè)置時(shí)間,以毫秒為單位萨咳,表示自格林威治標(biāo)準(zhǔn)時(shí)間 1970 年 1月 1 日 0:00:00 后經(jīng)過(guò)的時(shí)間懊缺。
static int TUESDAY
指示 Tuesday 的 DAY_OF_WEEK 字段值。
static int UNDECIMBER
指示一年中第十三個(gè)月的 MONTH 字段值某弦。
static int WEDNESDAY
指示 Wednesday 的 DAY_OF_WEEK 字段值桐汤。
static int WEEK_OF_MONTH
get 和 set 的字段數(shù)字,指示當(dāng)前月中的星期數(shù)靶壮。
static int WEEK_OF_YEAR
get 和 set 的字段數(shù)字怔毛,指示當(dāng)前年中的星期數(shù)。
static int YEAR
指示年的 get 和 set 的字段數(shù)字腾降。
static int ZONE_OFFSET
get 和 set 的字段數(shù)字拣度,以毫秒為單位指示距 GMT 的大致偏移量。
** Calendar類的方法: **
abstract void add(int field, int amount)
根據(jù)日歷的規(guī)則螃壤,為給定的日歷字段添加或減去指定的時(shí)間量抗果。
boolean after(Object when)
判斷此 Calendar 表示的時(shí)間是否在指定 Object 表示的時(shí)間之后,返回判斷結(jié)果奸晴。
boolean before(Object when)
判斷此 Calendar 表示的時(shí)間是否在指定 Object 表示的時(shí)間之前冤馏,返回判斷結(jié)果。
void clear()
將此 Calendar 的所日歷字段值和時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)設(shè)置成未定義寄啼。
void clear(int field)
將此 Calendar 的給定日歷字段值和時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)設(shè)置成未定義逮光。
Object clone()
創(chuàng)建并返回此對(duì)象的一個(gè)副本。
int compareTo(Calendar anotherCalendar)
比較兩個(gè) Calendar 對(duì)象表示的時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)墩划。"此函數(shù)返回值為三個(gè),分別為-1,0,1;-1指的是當(dāng)前Calendar比anotherCalendar的時(shí)間早,0指的是時(shí)間相同,1指的是比anotherCalendar時(shí)間晚"
boolean equals(Object obj)
將此 Calendar 與指定 Object 比較涕刚。
int get(int field)
返回給定日歷字段的值。
int getActualMaximum(int field)
給定此 Calendar 的時(shí)間值乙帮,返回指定日歷字段可能擁有的最大值杜漠。
int getActualMinimum(int field)
給定此 Calendar 的時(shí)間值,返回指定日歷字段可能擁有的最小值察净。
static Locale[] getAvailableLocales()
返回所有語(yǔ)言環(huán)境的數(shù)組驾茴,此類的 getInstance 方法可以為其返回本地化的實(shí)例。
String getDisplayName(int field, int style, Locale locale)
返回給定 style 和 locale 下的日歷 field 值的字符串表示形式氢卡。
Map<String,Integer> getDisplayNames(int field, int style, Locale locale)
返回給定 style 和 locale 下包含日歷 field 所有名稱的 Map 及其相應(yīng)字段值沟涨。
int getFirstDayOfWeek()
獲取一星期的第一天;例如异吻,在美國(guó),這一天是 SUNDAY,而在法國(guó)诀浪,這一天是 MONDAY棋返。
abstract int getGreatestMinimum(int field)
返回此 Calendar 實(shí)例給定日歷字段的最高的最小值。
static Calendar getInstance()
使用默認(rèn)時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷雷猪。
static Calendar getInstance(Locale aLocale)
使用默認(rèn)時(shí)區(qū)和指定語(yǔ)言環(huán)境獲得一個(gè)日歷睛竣。
static Calendar getInstance(TimeZone zone)
使用指定時(shí)區(qū)和默認(rèn)語(yǔ)言環(huán)境獲得一個(gè)日歷。
static Calendar getInstance(TimeZone zone, Locale aLocale)
使用指定時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷求摇。
abstract int getLeastMaximum(int field)
返回此 Calendar 實(shí)例給定日歷字段的最低的最大值射沟。
abstract int getMaximum(int field)
返回此 Calendar 實(shí)例給定日歷字段的最大值。
int getMinimalDaysInFirstWeek()
獲取一年中第一個(gè)星期所需的最少天數(shù)与境,例如验夯,如果定義第一個(gè)星期包含一年第一個(gè)月的第一天,則此方法將返回 1摔刁。
abstract int getMinimum(int field)
返回此 Calendar 實(shí)例給定日歷字段的最小值挥转。
Date getTime()
返回一個(gè)表示此 Calendar 時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)的 Date 對(duì)象。
long getTimeInMillis()
返回此 Calendar 的時(shí)間值共屈,以毫秒為單位绑谣。
TimeZone getTimeZone()
獲得時(shí)區(qū)。
int hashCode()
返回該此日歷的哈希碼拗引。
boolean isLenient()
判斷日期/時(shí)間的解釋是否為寬松的借宵。
boolean isSet(int field)
確定給定日歷字段是否已經(jīng)設(shè)置了一個(gè)值,其中包括因?yàn)檎{(diào)用 get 方法觸發(fā)內(nèi)部字段計(jì)算而導(dǎo)致已經(jīng)設(shè)置該值的情況矾削。
abstract void roll(int field, boolean up)
在給定的時(shí)間字段上添加或減去(上/下)單個(gè)時(shí)間單元壤玫,不更改更大的字段。
void roll(int field, int amount)
向指定日歷字段添加指定(有符號(hào)的)時(shí)間量怔软,不更改更大的字段垦细。
void set(int field, int value)
將給定的日歷字段設(shè)置為給定值。
void set(int year, int month, int date)
設(shè)置日歷字段 YEAR挡逼、MONTH 和 DAY_OF_MONTH 的值括改。
void set(int year, int month, int date, int hourOfDay, int minute)
設(shè)置日歷字段 YEAR、MONTH家坎、DAY_OF_MONTH嘱能、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)
設(shè)置字段 YEAR虱疏、MONTH惹骂、DAY_OF_MONTH、HOUR做瞪、MINUTE 和 SECOND 的值对粪。
void setFirstDayOfWeek(int value)
設(shè)置一星期的第一天是哪一天右冻;例如,在美國(guó)著拭,這一天是 SUNDAY纱扭,而在法國(guó),這一天是 MONDAY儡遮。
void setLenient(boolean lenient)
指定日期/時(shí)間解釋是否是寬松的乳蛾。
void setMinimalDaysInFirstWeek(int value)
設(shè)置一年中第一個(gè)星期所需的最少天數(shù),例如鄙币,如果定義第一個(gè)星期包含一年第一個(gè)月的第一天肃叶,則使用值 1 調(diào)用此方法。
void setTime(Date date)
使用給定的 Date 設(shè)置此 Calendar 的時(shí)間十嘿。
void setTimeInMillis(long millis)
用給定的 long 值設(shè)置此 Calendar 的當(dāng)前時(shí)間值因惭。
void setTimeZone(TimeZone value)
使用給定的時(shí)區(qū)值來(lái)設(shè)置時(shí)區(qū)。
String toString()
返回此日歷的字符串表示形式详幽。
1.1我們先來(lái)講解一下Calendar成員變量當(dāng)中,用與get,set的變量的具體含義,因?yàn)檫@些變量經(jīng)常會(huì)被使用(暫時(shí)先介紹我經(jīng)常會(huì)用到的吧,是按本人理解的解釋):
1.1.1 YEAR
這個(gè)字段的含義是年份,假如說(shuō)現(xiàn)在是2017-1-1,那么執(zhí)行:
System.out.println(instance.get(Calendar.YEAR));
打印出來(lái)的值就為2017
1.1.2 MONTH
這個(gè)字段的含義是月份,假如說(shuō)現(xiàn)在是2017-9-1,那么執(zhí)行:
System.out.println(instance.get(Calendar.MONTH));
打印出來(lái)的值就為8
,值得注意的是在Calendar當(dāng)中MONTH的開(kāi)始月份為0
1.1.3 WEEK_OF_YEAR
指的是當(dāng)前年的總周數(shù)當(dāng)中,當(dāng)前日期屬于第幾周
System.out.println("WEEK_OF_YEAR:"+instance.get(Calendar.WEEK_OF_YEAR));
System.out.println("一年有"+instance.getActualMaximum(Calendar.WEEK_OF_YEAR)+"個(gè)周");
打印出的結(jié)果為:
WEEK_OF_YEAR:12
一年有52個(gè)周
1.1.4 DATE
當(dāng)前時(shí)間為多少號(hào),例如今天為2017-3-20,那么:
System.out.println(instance.get(Calendar.DATE));
打印的值為:
20
1.1.5 DAY_OF_MONTH
這個(gè)月的總天數(shù)當(dāng)中當(dāng)前過(guò)了多少天(其實(shí)它的值和上面的DATE的值是一樣的)
System.out.println("DAY_OF_MONTH:"+instance.get(Calendar.DAY_OF_MONTH));
System.out.println("當(dāng)前月有"+instance.getActualMaximum(Calendar.DAY_OF_MONTH)+"天");
打印的結(jié)果為:
DAY_OF_MONTH:20
當(dāng)前月有31天
1.1.6 DAY_OF_YEAR
當(dāng)年的所有天數(shù)當(dāng)中,當(dāng)天過(guò)了多少天
System.out.println("DAY_OF_YEAR:"+instance.get(Calendar.DAY_OF_YEAR));
System.out.println("當(dāng)前年份有"+instance.getActualMaximum(Calendar.DAY_OF_YEAR)+"天");
打印的結(jié)果為:
DAY_OF_YEAR:79
當(dāng)前年份有365天
1.1.7 DAY_OF_WEEK
一周7天當(dāng)中,當(dāng)前時(shí)間是星期幾(1-7),值得注意的是一周的開(kāi)始是星期日,結(jié)束是星期六,
如果今天是星期一,那么instance.get(Calendar.DAY_OF_WEEK)
的值就應(yīng)該是2
1.1.8 DAY_OF_WEEK_IN_MONTH
指的是當(dāng)前時(shí)間是所在當(dāng)前月的第幾個(gè)星期,一個(gè)月的1號(hào)為第一周,8號(hào)為第二周
1.1.9 WEEK_OF_MONTH
同樣是按當(dāng)前時(shí)間在當(dāng)前月的星期數(shù),可是它的值不同于1.1.8的DAY_OF_WEEK_IN_MONTH,它計(jì)算當(dāng)前星期的標(biāo)準(zhǔn)不同,例如說(shuō)這個(gè)月的1號(hào)是星期3,那么是第一周,那么到了5號(hào)星期日就已經(jīng)是第二周了,如果按8的DAY_OF_WEEK_IN_MONTH的計(jì)算5號(hào)才第一周
System.out.println("WEEK_OF_MONTH:"+instance.get(Calendar.WEEK_OF_MONTH));
System.out.println("當(dāng)前月有"+instance.getActualMaximum(Calendar.WEEK_OF_MONTH)+"個(gè)周");
打印出來(lái)的結(jié)果為:
WEEK_OF_MONTH:4
當(dāng)前月有5個(gè)周
計(jì)算出來(lái)是4.4個(gè)周,它顯示的為5個(gè)周
1.2.0 AM_PM
用于判斷當(dāng)前時(shí)間是AM,還是PM,若是AM值為0,若是PM為1.
1.2.1 HOUR
顯示當(dāng)前時(shí)間的12小時(shí)制
1.2.2 HOUR_OF_DAY
顯示當(dāng)前時(shí)間的24小時(shí)制
1.2.3 MINUTE
顯示當(dāng)前時(shí)間的分鐘數(shù)
1.2.4 SECOND
顯示當(dāng)前時(shí)間的秒數(shù)
1.2.5 MILLISECOND
顯示當(dāng)前時(shí)間的毫秒數(shù)
1.2 還有幾個(gè)不用與get,set方法得值的成員變量(直接使用):
1.2.0 星期數(shù)成員變量SUNDAY-SATURDAY的值為1-7
1.2.1 月份成員變量JANUARY-DECEMBER(0-12)
2. GregorianCalendar類
GregorianCalendar類除了有其父類的各種豐富的屬性和方法之外,還有一些很好用的方法
其構(gòu)造方法:
GregorianCalendar()
Constructs a new GregorianCalendar initialized to the current date and time with the default Locale and TimeZone.
GregorianCalendar(int year, int month, int day)
Constructs a new GregorianCalendar initialized to midnight in the default TimeZone and Locale on the specified date.
GregorianCalendar(int year, int month, int day, int hour, int minute)
Constructs a new GregorianCalendar initialized to the specified date and time in the default TimeZone and Locale.
GregorianCalendar(int year, int month, int day, int hour, int minute, int second)
Constructs a new GregorianCalendar initialized to the specified date and time in the default TimeZone and Locale.
GregorianCalendar(Locale locale)
Constructs a new GregorianCalendar initialized to the current date and time and using the specified Locale and the default TimeZone.
GregorianCalendar(TimeZone timezone)
Constructs a new GregorianCalendar initialized to the current date and time and using the specified TimeZone and the default Locale.
GregorianCalendar(TimeZone timezone, Locale locale)
Constructs a new GregorianCalendar initialized to the current date and time and using the specified TimeZone and Locale.
其實(shí)在其父類Calendar都有這樣的功能
其中方法很有用:
boolean isLeapYear(int year)
判斷年份是否閏年
3. 時(shí)間處理的簡(jiǎn)單使用
分別獲取日期的各個(gè)屬性
Calendar instance = Calendar.getInstance();
System.out.println(instance.get(Calendar.YEAR)+"年");
System.out.println((instance.get(Calendar.MONTH)+1)+"月");
System.out.println(instance.get(Calendar.DATE)+"日");
System.out.println(instance.get(Calendar.HOUR_OF_DAY)+"時(shí)"); //24小時(shí)制
switch (instance.get(Calendar.AM_PM)) {
case Calendar.AM:
System.out.println("上午");
break;
case Calendar.PM:
System.out.println("下午");
break;
}
System.out.println(instance.get(Calendar.MINUTE)+"分");
System.out.println(instance.get(Calendar.SECOND)+"秒");
System.out.println(instance.get(Calendar.MILLISECOND)+"毫秒");
打印出:
2017年
3月
21日
10時(shí)
上午
7分
35秒
951毫秒
再演示:
Calendar instance = Calendar.getInstance();
long currentTime = instance.getTimeInMillis();//獲取當(dāng)前時(shí)間戳
instance.add(Calendar.DAY_OF_YEAR, 1); //把當(dāng)前時(shí)間改為明天的同一時(shí)刻
long tomorrowTime = instance.getTimeInMillis();
System.out.println("今天和明天相隔"+(tomorrowTime-currentTime)/(1000*60*60*24)+"天");
今天和明天相隔1天
有時(shí)候要注意把時(shí)間的時(shí)分秒毫秒都設(shè)為0,就例如從mysql數(shù)據(jù)庫(kù)中取出一個(gè)date類型的日期(yyyy-MM-dd)其日期時(shí)分秒毫秒都為0,如運(yùn)算時(shí)要一致:
當(dāng)我們要用當(dāng)前的系統(tǒng)時(shí)間和數(shù)據(jù)庫(kù)中的date比較日期的時(shí)候,如果比較的是某日期比當(dāng)前日期前或者后的話,可以用after或者before方法,返回的為boolean類型,但是如果要比較這兩個(gè)日期是否相等的話,就需要注意要把當(dāng)前系統(tǒng)時(shí)間的小時(shí),分鐘,秒,毫秒,都設(shè)置為0,才可以比較成功,或者用compareTo方法,此方法返回int類型,返回值分別為-1,1,0,分別為比某日期前,后,相等.
instance.set(Calendar.HOUR_OF_DAY, 0);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
instance.set(Calendar.MILLISECOND, 0);