您好,登錄后才能下訂單哦!
原文地址:http://www.work100.net/training/java-date-time.html
更多教程:光束云 - 免費課程
序號 | 文內章節 | 視頻 |
---|---|---|
1 | 概述 | - |
2 | 獲取當前日期時間 | - |
3 | 日期比較 | |
4 | 使用SimpleDateFormat格式化日期 | - |
5 | 日期和時間的格式化編碼 | - |
6 | 使用printf格式化日期 | - |
7 | 解析字符串為時間 | - |
8 | Java休眠(sleep) | - |
9 | 測量時間 | - |
10 | Calendar類 | - |
11 | GregorianCalendar類 | - |
請參照如上章節導航
進行閱讀
java.util
包提供了 Date
類來封裝當前的日期和時間。 Date
類提供兩個構造函數來實例化 Date
對象。
第一個構造函數使用當前日期和時間來初始化對象。
Date( )
第二個構造函數接收一個參數,該參數是從 1970年1月1日
起的毫秒數。
Date(long millisec)
Date
對象創建以后,可以調用下面的方法。
序號 | 方法和描述 |
---|---|
1 | boolean after(Date date) <br>若當調用此方法的 Date 對象在指定日期之后返回 true ,否則返回 false 。 |
2 | boolean before(Date date) <br>若當調用此方法的 Date 對象在指定日期之前返回 true ,否則返回 false 。 |
3 | Object clone( ) <br>返回此對象的副本。 |
4 | int compareTo(Date date) <br>比較當調用此方法的Date對象和指定日期。兩者相等時候返回0。<br>調用對象在指定日期之前則返回負數。調用對象在指定日期之后則返回正數。 |
5 | int compareTo(Object obj) <br>若obj是Date類型則操作等同于 compareTo(Date) 。否則它拋出 ClassCastException 。 |
6 | boolean equals(Object date) <br>當調用此方法的Date對象和指定日期相等時候返回 true ,否則返回 false 。 |
7 | long getTime( ) <br>返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。 |
8 | int hashCode( ) <br> 返回此對象的哈希碼值。 |
9 | void setTime(long time) <br>用自 1970年1月1日00:00:00 GMT 以后time毫秒數設置時間和日期。 |
10 | String toString( ) <br>把此 Date 對象轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy <br>其中: 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 2019
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
允許你選擇任何用戶自定義日期時間格式來運行。
例如:
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String[] args) {
Date dNow = new Date( );
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
小時制。
以上實例編譯運行結果如下:
當前時間為: 2019-12-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 |
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, 2019
定義日期格式的轉換符可以使日期通過指定的轉換符生成新字符串。這些日期轉換符如下所示:
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 DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-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 2019
Thu Sep 17 10:20:33 CST 2019
下面的一個例子表明如何測量時間間隔(以毫秒為單位):
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 c = Calendar.getInstance();//默認是當前日期
使用 Calendar
類代表特定的時間,需要首先創建一個 Calendar
的對象,然后再設定該對象中的年月日參數來完成。
//創建一個代表2009年6月12日的Calendar對象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);
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 c1 = Calendar.getInstance();
調用:
public final void set(int year,int month,int date)
c1.set(2009, 6, 12);//把Calendar對象c1的年月日分別設這為:2009、6、12
利用字段類型設置
如果只設定某個字段,例如日期的值,則可以使用如下 set
方法:
public void set(int field,int value)
把 c1
對象代表的日期設置為 10
號,其它所有的數值會被重新計算
c1.set(Calendar.DATE,10);
把 c1
對象代表的年份設置為 2008
年,其他的所有數值會被重新計算
c1.set(Calendar.YEAR,2008);
其他字段屬性 set
的意義以此類推
Calendar c1 = Calendar.getInstance();
把 c1
對象的日期加上 10
,也就是 c1
也就表示為 10
天后的日期,其它所有的數值會被重新計算
c1.add(Calendar.DATE, 10);
把 c1
對象的日期減去 10
,也就是 c1
也就表示為 10
天前的日期,其它所有的數值會被重新計算
c1.add(Calendar.DATE, -10);
其他字段屬性的 add
的意義以此類推
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代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);
Calendar
類實現了公歷日歷,GregorianCalendar
是 Calendar
類的一個具體實現。
Calendar
的 getInstance()
方法返回一個默認用當前的語言環境和時區初始化的 GregorianCalendar
對象。GregorianCalendar
定義了兩個字段:AD
和 BC
。這是代表公歷定義的兩個時代。
下面列出 GregorianCalendar
對象的幾個構造方法:
序號 | 構造函數和說明 |
---|---|
1 | GregorianCalendar() <br>在具有默認語言環境的默認時區內使用當前時間構造一個默認的 GregorianCalendar 。 |
2 | GregorianCalendar(int year, int month, int date) <br>在具有默認語言環境的默認時區內構造一個帶有給定日期設置的 GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) <br>為具有默認語言環境的默認時區構造一個具有給定日期和時間設置的 GregorianCalendar 。 |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) <br> 為具有默認語言環境的默認時區構造一個具有給定日期和時間設置的 GregorianCalendar 。 |
5 | GregorianCalendar(Locale aLocale) <br>在具有給定語言環境的默認時區內構造一個基于當前時間的 GregorianCalendar 。 |
6 | GregorianCalendar(TimeZone zone) <br>在具有默認語言環境的給定時區內構造一個基于當前時間的 GregorianCalendar 。 |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) <br> 在具有給定語言環境的給定時區內構造一個基于當前時間的 GregorianCalendar 。 |
這里是 GregorianCalendar
類提供的一些有用的方法列表:
序號 | 方法和說明 |
---|---|
1 | void add(int field, int amount) <br>根據日歷規則,將指定的(有符號的)時間量添加到給定的日歷字段中。 |
2 | protected void computeFields() <br>轉換 UTC 毫秒值為時間域值 |
3 | protected void computeTime() <br>覆蓋 Calendar ,轉換時間域值為 UTC 毫秒值 |
4 | boolean equals(Object obj) <br>比較此 GregorianCalendar 與指定的 Object 。 |
5 | int get(int field) <br>獲取指定字段的時間值 |
6 | int getActualMaximum(int field) <br>返回當前日期,給定字段的最大值 |
7 | int getActualMinimum(int field) <br>返回當前日期,給定字段的最小值 |
8 | int getGreatestMinimum(int field) <br> 返回此 GregorianCalendar 實例給定日歷字段的最高的最小值。 |
9 | Date getGregorianChange() <br>獲得格里高利歷的更改日期。 |
10 | int getLeastMaximum(int field) <br>返回此 GregorianCalendar 實例給定日歷字段的最低的最大值 |
11 | int getMaximum(int field) <br>返回此 GregorianCalendar 實例的給定日歷字段的最大值。 |
12 | Date getTime() <br>獲取日歷當前時間。 |
13 | long getTimeInMillis() <br>獲取用長整型表示的日歷的當前時間 |
14 | TimeZone getTimeZone() <br>獲取時區。 |
15 | int getMinimum(int field) <br>返回給定字段的最小值。 |
16 | int hashCode() <br>重寫 hashCode . |
17 | boolean isLeapYear(int year) <br>確定給定的年份是否為閏年。 |
18 | void roll(int field, boolean up) <br>在給定的時間字段上添加或減去(上/下)單個時間單元,不更改更大的字段。 |
19 | void set(int field, int value) <br>用給定的值設置時間字段。 |
20 | void set(int year, int month, int date) <br>設置年、月、日的值。 |
21 | void set(int year, int month, int date, int hour, int minute) <br>設置年、月、日、小時、分鐘的值。 |
22 | void set(int year, int month, int date, int hour, int minute, int second) <br>設置年、月、日、小時、分鐘、秒的值。 |
23 | void setGregorianChange(Date date) <br>設置 GregorianCalendar 的更改日期。 |
24 | void setTime(Date date) <br>用給定的日期設置 Calendar 的當前時間。 |
25 | void setTimeInMillis(long millis) <br>用給定的 long 型毫秒數設置 Calendar 的當前時間。 |
26 | void setTimeZone(TimeZone value) <br>用給定時區值設置當前時區。 |
27 | String toString() <br>返回代表日歷的字符串。 |
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 2009
Time: 11:25:27
當前年份不是閏年
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-1
2017-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-1
2017-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-1
2017-1-18
果然可以,所以日期才可以自由加減。
月份也可以是負數,規則與日期一樣,就不上代碼了。
實測將年份設為非正數時,會自動變為 絕對值+1
,不知其意義。
上一篇:StringBuffer
下一篇:日期時間
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。