Java日期時間
java.util
包提供了Date
類來封裝當前的日期和時間。Date
類提供兩個構造函數來實例化Date
對象。
第一個構造函數使用當前日期和時間來初始化對象。
Date( )
第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。
Date(long millisec)
Date對象創建以后,可以調用下面的方法。
獲取當前日期時間:
Java中獲取當前日期和時間很簡單,使用Date
對象的toString()
方法來打印當前日期和時間,如下所示:
package educoder;
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 對象
Date date = new Date();
// 使用 toString() 函數顯示日期時間
System.out.println(date.toString());
}
}
輸出結果:
Sun Aug 12 23:33:44 CST 2018
日期比較:
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
允許你選擇任何用戶自定義日期時間格式來運行。例如:
package educoder;
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat(
"E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
這一行代碼確立了轉換的格式,其中yyyy
是完整的公元年,MM
是月份,dd
是日期,hh
:mm
:ss
是時、分、秒。
注意:有的格式大寫,有的格式小寫,例如MM
是月份,mm
是分;HH
是 24 小時制,而 hh 是 12 小時制。
以上實例編譯運行結果如下:
Current Date: 星期日 2018.08.12 at 11:45:16 下午 CST
日期和時間的格式化編碼:
時間模式字符串用來指定時間格式。在此模式中,所有的ASCII
字母被保留為模式字母,定義如下:
使用printf
格式化日期
printf
方法可以很輕松地格式化時間和日期。使用兩個字母格式,它以%t
開頭並且以下面表格中的一個字母結尾。
實例:
package educoder;
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);
}
}
輸出結果:
全部日期和時間信息:星期日 八月 12 23:51:03 CST 2018
年-月-日格式:2018-08-12
月/日/年格式:08/12/18
HH
:MM
:SS
PM格式(12時制):11:51:03 下午
HH
:MM
:SS
格式(24時制):23:51:03
HH
:MM
格式(24時制):23:51
如果你需要重復提供日期,那么利用這種方式來格式化它的每一部分就有點復雜了。因此,可以利用一個格式化字符串指出要被格式化的參數的索引。
索引必須緊跟在%
后面,而且必須以$
結束。例如:
package educoder;
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: 八月 12, 2018
或者,你可以使用<
標志。它表明先前被格式化的參數要被再次使用。例如:
package educoder;
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: 八月 12, 2018
定義日期格式的轉換符可以使日期通過指定的轉換符生成新字符串。這些日期轉換符如下所示:
package educoder;
import java.util.Date;
import java.util.Locale;
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);
}
}
輸出結果:
英文月份簡稱:Aug
本地月份簡稱:八月
英文月份全稱:August
本地月份全稱:八月
英文星期的簡稱:Sun
本地星期的簡稱:星期日
年的前兩位數字(不足兩位前面補0):20
年的后兩位數字(不足兩位前面補0):18
一年中的天數(即年的第幾天):224
兩位數字的月份(不足兩位前面補0):08
兩位數字的日(不足兩位前面補0):12
月份的日(前面不補0):12
解析字符串為時間:
SimpleDateFormat
類有一些附加的方法,特別是parse()
,它試圖按照給定的SimpleDateFormat
對象的格式化存儲來解析字符串。例如:
package educoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
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);
}
}
}
輸出結果:
1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818
Java休眠(sleep
)
sleep()
使當前線程進入停滯狀態(阻塞當前線程),讓出CPU
的使用、目的是不讓當前線程獨自霸占該進程所獲的CPU
資源,以留一定時間給其他線程執行的機會。
你可以讓程序休眠一毫秒的時間或者到您的計算機的壽命長的任意段時間。例如,下面的程序會休眠3秒:
package educoder;
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!");
}
}
}
輸出結果:
Mon Aug 13 00:05:33 CST 2018
Mon Aug 13 00:05:36 CST 2018
測量時間:
下面的一個例子表明如何測量時間間隔(以毫秒為單位):
package educoder;
import java.util.Date;
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!");
}
}
}
輸出結果:
Mon Aug 13 00:07:58 CST 2018
Mon Aug 13 00:08:01 CST 2018
Difference is : 3021
編程要求
請仔細閱讀右側代碼,根據方法內的提示,在Begin - End
區域內進行代碼補充,具體任務如下:
測試輸入:
1999-09-01
預期輸出:
你的出生日期距離2020年10月1日:7701天
代碼