學習Java途徑:
java.util包提供了 Date 類來封裝當前的日期和時間,Date類提供兩個構造函數來實例化Date 對象。
第一個構造函數使用當前日期和時間來初始化對象。java
Date( )
第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。程序員
Date(long millisec)
Date對象建立之後,能夠調用下面的方法。
序號 方法和描述正則表達式
若當調用此方法的Date對象在指定日期以後返回true,不然返回false。數組
若當調用此方法的Date對象在指定日期以前返回true,不然返回false。ide
返回此對象的副本。函數
比較當調用此方法的Date對象和指定日期。二者相等時候返回0。調用對象在指定日期以前則返回負數。調用對象在指定日期以後則返回正數。學習
若obj是Date類型則操做等同於compareTo(Date) 。不然它拋出ClassCastException。測試
當調用此方法的Date對象和指定日期相等時候返回true,不然返回false。編碼
返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。spa
返回此對象的哈希碼值。
用自1970年1月1日00:00:00 GMT之後time毫秒數設置時間和日期。
把此 Date 對象轉換爲如下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一週中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
Java中獲取當前日期和時間很簡單,使用 Date 對象的 toString() 方法來打印當前日期和時間,以下所示:
實例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 對象 Date date = new Date(); // 使用 toString() 函數顯示日期時間 System.out.println(date.toString()); } }
運行實例 »
以上實例編譯運行結果以下:
Mon May 04 09:51:52 CDT 2013
Java使用如下三種方法來比較兩個日期:
• 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),而後比較這兩個值。
• 使用方法 before(),after() 和 equals()。例如,一個月的12號比18號早,則 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
• 使用 compareTo() 方法,它是由 Comparable 接口定義的,Date 類實現了這個接口。
使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一個以語言環境敏感的方式來格式化和分析日期的類。SimpleDateFormat 容許你選擇任何用戶自定義日期時間格式來運行。例如:
實例
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); System.out.println("當前時間爲: " + ft.format(dNow)); } }
運行實例 »
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
這一行代碼確立了轉換的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是時、分、秒。
注意:有的格式大寫,有的格式小寫,例如 MM 是月份,mm 是分;HH 是 24 小時制,而 hh 是 12 小時制。
以上實例編譯運行結果以下:
當前時間爲: 2018-09-06 10:16:34
時間模式字符串用來指定時間格式。在此模式中,全部的 ASCII 字母被保留爲模式字母,定義以下:
字母 描述 示例
G 紀元標記 AD y 四位年份 2001 M 月份 July or 07 d 一個月的日期 10 h A.M./P.M. (1~12)格式小時 12 H 一天中的小時 (0~23) 22 m 分鐘數 30 s 秒數 55 S 毫秒數 234 E 星期幾 Tuesday D 一年中的日子 360 F 一個月中第幾周的周幾 2 (second Wed. in July) w 一年中第幾周 40 W 一個月中第幾周 1 a A.M./P.M. 標記 PM k 一天中的小時(1~24) 24 K A.M./P.M. (0~11)格式小時 10 z 時區 Eastern Standard Time ' 文字定界符 Delimiter " 單引號 `
printf 方法能夠很輕鬆地格式化時間和日期。使用兩個字母格式,它以 %t 開頭而且如下面表格中的一個字母結尾。
轉 換 符 說 明 示 例
c 包括所有日期和時間信息 星期六 十月 27 14:21:20 CST 2007
F "年-月-日"格式 2007-10-27
D "月/日/年"格式 10/27/07
r "HH:MM:SS PM"格式(12時制) 02:25:51 下午
T "HH:MM:SS"格式(24時制) 14:28:16
R "HH:MM"格式(24時制) 14:28
更多 printf 解析能夠參見:Java 格式化輸出 printf 例子
實例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 對象 Date date = new Date(); //c的使用 System.out.printf("所有日期和時間信息:%tc%n",date); //f的使用 System.out.printf("年-月-日格式:%tF%n",date); //d的使用 System.out.printf("月/日/年格式:%tD%n",date); //r的使用 System.out.printf("HH:MM:SS PM格式(12時制):%tr%n",date); //t的使用 System.out.printf("HH:MM:SS格式(24時制):%tT%n",date); //R的使用 System.out.printf("HH:MM格式(24時制):%tR",date); } }
以上實例編譯運行結果以下:
所有日期和時間信息:星期一 九月 10 10:43:36 CST 2012 年-月-日格式:2012-09-10 月/日/年格式:09/10/12 HH:MM:SS PM格式(12時制):10:43:36 上午 HH:MM:SS格式(24時制):10:43:36 HH:MM格式(24時制):10:43
若是你須要重複提供日期,那麼利用這種方式來格式化它的每一部分就有點複雜了。所以,能夠利用一個格式化字符串指出要被格式化的參數的索引。
索引必須緊跟在%後面,並且必須以$結束。例如:
實例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 對象 Date date = new Date(); // 使用toString()顯示日期和時間 System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date); } }
運行實例 »
以上實例編譯運行結果以下:
Due date: February 09, 2014
或者,你可使用 < 標誌。它代表先前被格式化的參數要被再次使用。例如:
實例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 對象 Date date = new Date(); // 顯示格式化時間 System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } }
運行實例 »
以上實例編譯運行結果以下:
Due date: February 09, 2014
定義日期格式的轉換符可使日期經過指定的轉換符生成新字符串。這些日期轉換符以下所示:
實例
import java.util.*; public class DateDemo { public static void main(String args[]) { Date date=new Date(); //b的使用,月份簡稱 String str=String.format(Locale.US,"英文月份簡稱:%tb",date); System.out.println(str); System.out.printf("本地月份簡稱:%tb%n",date); //B的使用, 月份全稱 str=String.format(Locale.US,"英文月份全稱:%tB",date); System.out.println(str); System.out.printf("本地月份全稱:%tB%n",date); //a的使用,星期簡稱 str=String.format(Locale.US,"英文星期的簡稱:%ta",date); System.out.println(str); //A的使用,星期全稱 System.out.printf("本地星期的簡稱:%tA%n",date); //C的使用,年前兩位 System.out.printf("年的前兩位數字(不足兩位前面補0):%tC%n",date); //y的使用,年後兩位 System.out.printf("年的後兩位數字(不足兩位前面補0):%ty%n",date); //j的使用,一年的天數 System.out.printf("一年中的天數(即年的第幾天):%tj%n",date); //m的使用,月份 System.out.printf("兩位數字的月份(不足兩位前面補0):%tm%n",date); //d的使用,日(二位,不夠補零) System.out.printf("兩位數字的日(不足兩位前面補0):%td%n",date); //e的使用,日(一位不補零) System.out.printf("月份的日(前面不補0):%te",date); } }
輸出結果爲:
英文月份簡稱:May本地月份簡稱:五月英文月份全稱:May本地月份全稱:五月英文星期的簡稱:Thu本地星期的簡稱:星期四年的前兩位數字(不足兩位前面補0):20年的後兩位數字(不足兩位前面補0):17一年中的天數(即年的第幾天):124兩位數字的月份(不足兩位前面補0):05兩位數字的日(不足兩位前面補0):04月份的日(前面不補0):4
SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。例如:
實例
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } }
運行實例 »
以上實例編譯運行結果以下:
$ java DateDemo1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818 $ java DateDemo 2007-12-012007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CPU的使用、目的是不讓當前線程獨自霸佔該進程所獲的CPU資源,以留必定時間給其餘線程執行的機會。
你可讓程序休眠一毫秒的時間或者到您的計算機的壽命長的任意段時間。例如,下面的程序會休眠3秒:
實例
import java.util.*; public class SleepDemo { public static void main(String args[]) { try { System.out.println(new Date( ) + "\n"); Thread.sleep(1000*3); // 休眠3秒 System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } }
運行實例 »
以上實例編譯運行結果以下:
Thu Sep 17 10:20:30 CST 2015 Thu Sep 17 10:20:33 CST 2015 _______________________
下面的一個例子代表如何測量時間間隔(以毫秒爲單位):
實例
import java.util.*; public class DiffDemo { public static void main(String args[]) { try { long start = System.currentTimeMillis( ); System.out.println(new Date( ) + "\n"); Thread.sleep(5*60*10); System.out.println(new Date( ) + "\n"); long end = System.currentTimeMillis( ); long diff = end - start; System.out.println("Difference is : " + diff); } catch (Exception e) { System.out.println("Got an exception!"); } } }
運行實例 »
以上實例編譯運行結果以下:
Fri Jan 08 09:48:47 CST 2016 Fri Jan 08 09:48:50 CST 2016 Difference is : 3019
咱們如今已經可以格式化並建立一個日期對象了,可是咱們如何才能設置和獲取日期數據的特定部分呢,好比說小時,日,或者分鐘? 咱們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。
Calendar類的功能要比Date類強大不少,並且在實現方式上也比Date類要複雜一些。
Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,建立對象的過程對程序員來講是透明的,只須要使用getInstance方法建立便可。
建立一個表明系統當前日期的Calendar對象
Calendar c = Calendar.getInstance(); //默認是當前日期
建立一個指定日期的Calendar對象
使用Calendar類表明特定的時間,須要首先建立一個Calendar的對象,而後再設定該對象中的年月日參數來完成。
//建立一個表明2009年6月12日的Calendar對象Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);
Calendar類對象字段類型
Calendar類中用如下這些常量表示不一樣的意義,jdk內的不少類其實都是採用的這種思想
常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意義徹底相同
Calendar.HOUR 12小時制的小時
Calendar.HOUR_OF_DAY 24小時制的小時
Calendar.MINUTE 分鐘
Calendar.SECOND 秒
Calendar.DAY_OF_WEEK 星期幾
Calendar類對象信息的設置
Set設置
如:
Calendar c1 = Calendar.getInstance();
調用:
public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);//把Calendar對象c1的年月日分別設這爲:200九、六、12
利用字段類型設置
若是隻設定某個字段,例如日期的值,則可使用以下set方法:
public void set(int field,int value)
把 c1對象表明的日期設置爲10號,其它全部的數值會被從新計算
c1.set(Calendar.DATE,10);
把c1對象表明的年份設置爲2008年,其餘的全部數值會被從新計算
c1.set(Calendar.YEAR,2008);
其餘字段屬性set的意義以此類推
Add設置
Calendar c1 = Calendar.getInstance();
把c1對象的日期加上10,也就是c1也就表示爲10天后的日期,其它全部的數值會被從新計算
c1.add(Calendar.DATE, 10);
把c1對象的日期減去10,也就是c1也就表示爲10天前的日期,其它全部的數值會被從新計算
c1.add(Calendar.DATE, -10);
其餘字段屬性的add的意義以此類推
Calendar類對象信息的得到
Calendar c1 = Calendar.getInstance(); // 得到年份 int year = c1.get(Calendar.YEAR); // 得到月份 int month = c1.get(Calendar.MONTH) + 1; // 得到日期 int date = c1.get(Calendar.DATE); // 得到小時 int hour = c1.get(Calendar.HOUR_OF_DAY); // 得到分鐘 int minute = c1.get(Calendar.MINUTE); // 得到秒 int second = c1.get(Calendar.SECOND); // 得到星期幾(注意(這個與Date類是不一樣的):1表明星期日、2表明星期一、3表明星期二,以此類推) int day = c1.get(Calendar.DAY_OF_WEEK);
GregorianCalendar類
Calendar類實現了公曆日曆,GregorianCalendar是Calendar類的一個具體實現。
Calendar 的getInstance()方法返回一個默認用當前的語言環境和時區初始化的GregorianCalendar對象。GregorianCalendar定義了兩個字段:AD和BC。這是表明公曆定義的兩個時代。
下面列出GregorianCalendar對象的幾個構造方法:
序號 構造函數和說明
1 GregorianCalendar()
在具備默認語言環境的默認時區內使用當前時間構造一個默認的 GregorianCalendar。
2 GregorianCalendar(int year, int month, int date)
在具備默認語言環境的默認時區內構造一個帶有給定日期設置的 GregorianCalendar
3 GregorianCalendar(int year, int month, int date, int hour, int minute)
爲具備默認語言環境的默認時區構造一個具備給定日期和時間設置的 GregorianCalendar。
4 GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
爲具備默認語言環境的默認時區構造一個具備給定日期和時間設置的 GregorianCalendar。
5 GregorianCalendar(Locale aLocale)
在具備給定語言環境的默認時區內構造一個基於當前時間的 GregorianCalendar。
6 GregorianCalendar(TimeZone zone)
在具備默認語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar。
7 GregorianCalendar(TimeZone zone, Locale aLocale)
在具備給定語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar。
這裏是GregorianCalendar 類提供的一些有用的方法列表:
序號 方法和說明
1 void add(int field, int amount)
根據日曆規則,將指定的(有符號的)時間量添加到給定的日曆字段中。
2 protected void computeFields()
轉換UTC毫秒值爲時間域值
3 protected void computeTime()
覆蓋Calendar ,轉換時間域值爲UTC毫秒值
4 boolean equals(Object obj)
比較此 GregorianCalendar 與指定的 Object。
5 int get(int field)
獲取指定字段的時間值
6 int getActualMaximum(int field)
返回當前日期,給定字段的最大值
7 int getActualMinimum(int field)
返回當前日期,給定字段的最小值
8 int getGreatestMinimum(int field)
返回此 GregorianCalendar 實例給定日曆字段的最高的最小值。
9 Date getGregorianChange()
得到格里高利曆的更改日期。
10 int getLeastMaximum(int field)
返回此 GregorianCalendar 實例給定日曆字段的最低的最大值
11 int getMaximum(int field)
返回此 GregorianCalendar 實例的給定日曆字段的最大值。
12 Date getTime()
獲取日曆當前時間。
13 long getTimeInMillis()
獲取用長整型表示的日曆的當前時間
14 TimeZone getTimeZone()
獲取時區。
15 int getMinimum(int field)
返回給定字段的最小值。
16 int hashCode()
重寫hashCode.
17 boolean isLeapYear(int year)
肯定給定的年份是否爲閏年。
18 void roll(int field, boolean up)
在給定的時間字段上添加或減去(上/下)單個時間單元,不更改更大的字段。
19 void set(int field, int value)
用給定的值設置時間字段。
20 void set(int year, int month, int date)
設置年、月、日的值。
21 void set(int year, int month, int date, int hour, int minute)
設置年、月、日、小時、分鐘的值。
22 void set(int year, int month, int date, int hour, int minute, int second)
設置年、月、日、小時、分鐘、秒的值。
23 void setGregorianChange(Date date)
設置 GregorianCalendar 的更改日期。
24 void setTime(Date date)
用給定的日期設置Calendar的當前時間。
25 void setTimeInMillis(long millis)
用給定的long型毫秒數設置Calendar的當前時間。
26 void setTimeZone(TimeZone value)
用給定時區值設置當前時區。
27 String toString()
返回表明日曆的字符串。
實例
實例
import java.util.*; public class GregorianCalendarDemo { public static void main(String args[]) { String months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int year; // 初始化 Gregorian 日曆 // 使用當前時間和日期 // 默認爲本地時間和時區 GregorianCalendar gcalendar = new GregorianCalendar(); // 顯示當前時間和日期的信息 System.out.print("Date: "); System.out.print(months[gcalendar.get(Calendar.MONTH)]); System.out.print(" " + gcalendar.get(Calendar.DATE) + " "); System.out.println(year = gcalendar.get(Calendar.YEAR)); System.out.print("Time: "); System.out.print(gcalendar.get(Calendar.HOUR) + ":"); System.out.print(gcalendar.get(Calendar.MINUTE) + ":"); System.out.println(gcalendar.get(Calendar.SECOND)); // 測試當前年份是否爲閏年 if(gcalendar.isLeapYear(year)) { System.out.println("當前年份是閏年"); } else { System.out.println("當前年份不是閏年"); } } }
運行實例 »
以上實例編譯運行結果以下:
Date: Apr 22 2009Time: 11:25:27當前年份不是閏年
關於 Calender 類的完整列表,你能夠參考標準的 Java文檔。
Java 數組
Java 正則表達式
1 篇筆記 寫筆記
.
Calender的月份是從0開始的,但日期和年份是從1開始的
.
示例代碼:
.
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c1 = Calendar.getInstance(); c1.set(2017, 1, 1); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); c1.set(2017, 1, 0); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); }} .
運行結果:
.
2017-1-12017-0-31
.
可見,將日期設爲0之後,月份變成了上個月,但月份能夠爲0
.
把月份改成2試試:
.
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c1 = Calendar.getInstance(); c1.set(2017, 2, 1); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); c1.set(2017, 2, 0); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); }}
.
運行結果:
.
2017-2-12017-1-28 .
能夠看到上個月的最後一天是28號,因此Calendar.MONTH爲1的時候是2月
.
既然日期設爲0表示上個月的最後一天,那是否是能夠設爲負數呢?
.
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c1 = Calendar.getInstance(); c1.set(2017, 2, 1); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); c1.set(2017, 2, -10); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); }}
.
運行結果:
.
2017-2-12017-1-18
.