Date類和SimpleDateFormat類的用法


Java日期時間

java.util包提供了Date類來封裝當前的日期和時間。Date類提供兩個構造函數來實例化Date對象。

第一個構造函數使用當前日期和時間來初始化對象。

  1. Date( )

第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。

  1. Date(long millisec)

Date對象創建以后,可以調用下面的方法。

獲取當前日期時間:

Java中獲取當前日期和時間很簡單,使用Date對象的toString()方法來打印當前日期和時間,如下所示:

  1. package educoder;
  2. import java.util.Date;
  3. public class DateDemo {
  4. public static void main(String args[]) {
  5. // 初始化 Date 對象
  6. Date date = new Date();
  7. // 使用 toString() 函數顯示日期時間
  8. System.out.println(date.toString());
  9. }
  10. }

輸出結果:

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允許你選擇任何用戶自定義日期時間格式來運行。例如:

  1. package educoder;
  2. import java.util.*;
  3. import java.text.*;
  4. public class DateDemo {
  5. public static void main(String args[]) {
  6. Date dNow = new Date();
  7. SimpleDateFormat ft = new SimpleDateFormat(
  8. "E yyyy.MM.dd 'at' hh:mm:ss a zzz");
  9. System.out.println("Current Date: " + ft.format(dNow));
  10. }
  11. }
  1. 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開頭並且以下面表格中的一個字母結尾。

實例:

  

  1. package educoder;
  2. import java.util.Date;
  3. public class DateDemo {
  4. public static void main(String args[]) {
  5. // 初始化 Date 對象
  6. Date date = new Date();
  7. // c的使用
  8. System.out.printf("全部日期和時間信息:%tc%n", date);
  9. // f的使用
  10. System.out.printf("年-月-日格式:%tF%n", date);
  11. // d的使用
  12. System.out.printf("月/日/年格式:%tD%n", date);
  13. // r的使用
  14. System.out.printf("HH:MM:SS PM格式(12時制):%tr%n", date);
  15. // t的使用
  16. System.out.printf("HH:MM:SS格式(24時制):%tT%n", date);
  17. // R的使用
  18. System.out.printf("HH:MM格式(24時制):%tR", date);
  19. }
  20. }

輸出結果:

全部日期和時間信息:星期日 八月 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

如果你需要重復提供日期,那么利用這種方式來格式化它的每一部分就有點復雜了。因此,可以利用一個格式化字符串指出要被格式化的參數的索引。

索引必須緊跟在%后面,而且必須以$結束。例如:

  1. package educoder;
  2. import java.util.Date;
  3. public class DateDemo {
  4. public static void main(String args[]) {
  5. // 初始化 Date 對象
  6. Date date = new Date();
  7. // 使用toString()顯示日期和時間
  8. System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
  9. }
  10. }

輸出結果:

Due date: 八月 12, 2018

或者,你可以使用<標志。它表明先前被格式化的參數要被再次使用。例如:

  1. package educoder;
  2. import java.util.Date;
  3. public class DateDemo {
  4. public static void main(String args[]) {
  5. // 初始化 Date 對象
  6. Date date = new Date();
  7. // 顯示格式化時間
  8. System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
  9. }
  10. }

輸出結果:

Due date: 八月 12, 2018

定義日期格式的轉換符可以使日期通過指定的轉換符生成新字符串。這些日期轉換符如下所示:

  1. package educoder;
  2. import java.util.Date;
  3. import java.util.Locale;
  4. public class DateDemo {
  5. public static void main(String args[]) {
  6. Date date = new Date();
  7. // b的使用,月份簡稱
  8. String str = String.format(Locale.US, "英文月份簡稱:%tb", date);
  9. System.out.println(str);
  10. System.out.printf("本地月份簡稱:%tb%n", date);
  11. // B的使用,月份全稱
  12. str = String.format(Locale.US, "英文月份全稱:%tB", date);
  13. System.out.println(str);
  14. System.out.printf("本地月份全稱:%tB%n", date);
  15. // a的使用,星期簡稱
  16. str = String.format(Locale.US, "英文星期的簡稱:%ta", date);
  17. System.out.println(str);
  18. // A的使用,星期全稱
  19. System.out.printf("本地星期的簡稱:%tA%n", date);
  20. // C的使用,年前兩位
  21. System.out.printf("年的前兩位數字(不足兩位前面補0):%tC%n", date);
  22. // y的使用,年后兩位
  23. System.out.printf("年的后兩位數字(不足兩位前面補0):%ty%n", date);
  24. // j的使用,一年的天數
  25. System.out.printf("一年中的天數(即年的第幾天):%tj%n", date);
  26. // m的使用,月份
  27. System.out.printf("兩位數字的月份(不足兩位前面補0):%tm%n", date);
  28. // d的使用,日(二位,不夠補零)
  29. System.out.printf("兩位數字的日(不足兩位前面補0):%td%n", date);
  30. // e的使用,日(一位不補零)
  31. System.out.printf("月份的日(前面不補0):%te", date);
  32. }
  33. }

輸出結果:

英文月份簡稱:Aug

本地月份簡稱:八月

英文月份全稱:August

本地月份全稱:八月

英文星期的簡稱:Sun

本地星期的簡稱:星期日

年的前兩位數字(不足兩位前面補0):20

年的后兩位數字(不足兩位前面補0):18

一年中的天數(即年的第幾天):224

兩位數字的月份(不足兩位前面補0):08

兩位數字的日(不足兩位前面補0):12

月份的日(前面不補0):12

解析字符串為時間:

SimpleDateFormat類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat對象的格式化存儲來解析字符串。例如:

  1. package educoder;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. public class DateDemo {
  6. public static void main(String args[]) {
  7. SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
  8. String input = args.length == 0 ? "1818-11-11" : args[0];
  9. System.out.print(input + " Parses as ");
  10. Date t;
  11. try {
  12. t = ft.parse(input);
  13. System.out.println(t);
  14. } catch (ParseException e) {
  15. System.out.println("Unparseable using " + ft);
  16. }
  17. }
  18. }

輸出結果:

1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818

Java休眠(sleep)

sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CPU的使用、目的是不讓當前線程獨自霸占該進程所獲的CPU資源,以留一定時間給其他線程執行的機會。

你可以讓程序休眠一毫秒的時間或者到您的計算機的壽命長的任意段時間。例如,下面的程序會休眠3秒:

  1. package educoder;
  2. import java.util.*;
  3. public class SleepDemo {
  4. public static void main(String args[]) {
  5. try {
  6. System.out.println(new Date() + "\n");
  7. Thread.sleep(1000 * 3); // 休眠3秒
  8. System.out.println(new Date() + "\n");
  9. } catch (Exception e) {
  10. System.out.println("Got an exception!");
  11. }
  12. }
  13. }

輸出結果:

Mon Aug 13 00:05:33 CST 2018

Mon Aug 13 00:05:36 CST 2018

測量時間:

下面的一個例子表明如何測量時間間隔(以毫秒為單位):

  1. package educoder;
  2. import java.util.Date;
  3. public class DiffDemo {
  4. public static void main(String args[]) {
  5. try {
  6. long start = System.currentTimeMillis();
  7. System.out.println(new Date() + "\n");
  8. Thread.sleep(5 * 60 * 10);
  9. System.out.println(new Date() + "\n");
  10. long end = System.currentTimeMillis();
  11. long diff = end - start;
  12. System.out.println("Difference is : " + diff);
  13. } catch (Exception e) {
  14. System.out.println("Got an exception!");
  15. }
  16. }
  17. }

輸出結果:

Mon Aug 13 00:07:58 CST 2018

Mon Aug 13 00:08:01 CST 2018

Difference is : 3021

 

編程要求

請仔細閱讀右側代碼,根據方法內的提示,在Begin - End區域內進行代碼補充,具體任務如下:

  • 編寫測試類,算一下你的出生日期到2020年10月1日總共有多少天;

  • 具體輸出要求請看測試說明。

    測試說明

    補充完代碼后,點擊測評,平台會對你編寫的代碼進行測試,當你的結果與預期輸出一致時,即為通過。

測試輸入:

1999-09-01

預期輸出:

你的出生日期距離2020年10月1日:7701天

 

代碼

package case5;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class DateTest {
public static void main(String[] args) throws ParseException {
// 鍵盤錄入你的出生年月日 格式為yyyy-MM-dd
// 把該字符串轉換為一個日期
// 通過該日期得到一個毫秒值
// 獲取2020年10月1日的毫秒值
// 兩者想減得到一個毫秒值
// 把該毫秒值轉換為天 打印輸出
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
/********* Begin *********/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = sdf.parse(line);
//parse() 方法可解析一個日期時間字符串,並返回 1970/1/1 午夜距離該日期時間的毫秒數。
long myTime = d1.getTime();
Date d2 = sdf.parse("2020-10-01");
long endTime = d2.getTime();
long time = endTime - myTime;
long day = time / 1000 / 60 / 60 / 24;
System.out.println("你的出生日期距離2020年10月1日:" + day + "天");
/********* End *********/
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM