1. 程式人生 > 程式設計 >JAVA 格式化日期、時間的方法

JAVA 格式化日期、時間的方法

使用 DateFormat 格式化日期、時間

DateFormat 也是一個抽象類,它也提供瞭如下幾個類方法用於獲取 DateFormat 物件。

  • getDateInstance():返回一個日期格式器,它格式化後的字串只有日期,沒有時間。該方法可以傳入多個引數,用於指定日期樣式和 Locale 等引數;如果不指定這些引數,則使用預設引數。
  • getTimeInstance():返回一個時間格式器,它格式化後的字串只有時間,沒有日期。該方法可以傳入多個引數,用於指定時間樣式和 Locale 等引數;如果不指定這些引數,則使用預設引數。
  • getDateTimeInstance():返回一個日期、時間格式器,它格式化後的字串既有日期,也有時間。該方法可以傳入多個引數,用於指定日期樣式、時間樣式和 Locale 等引數;如果不指定這些引數,則使用預設引數。

上面三個方法可以指定日期樣式、時間樣式引數,它們是的4個靜態常量:FULL、LONG、MEDIUM 和 SHORT,通過這4個樣式引數可以控制生成的格式化字串。看如下例子程式。

import java.util.*;
import java.text.*;
import static java.text.DateFormat.*;

public class DateFormatTest {
  public static void main(String[] args) throws ParseException {
    // 需要被格式化的時間
    Date dt = new Date();
    // 建立兩個Locale,分別代表中國、美國
    Locale[] locales = { Locale.CHINA,Locale.US };
    DateFormat[] df = new DateFormat[16];
    // 為上面兩個Locale建立16個DateFormat物件
    for (int i = 0; i < locales.length; i++) {
      df[i * 8] = DateFormat.getDateInstance(SHORT,locales[i]);
      df[i * 8 + 1] = DateFormat.getDateInstance(MEDIUM,locales[i]);
      df[i * 8 + 2] = DateFormat.getDateInstance(LONG,locales[i]);
      df[i * 8 + 3] = DateFormat.getDateInstance(FULL,locales[i]);
      df[i * 8 + 4] = DateFormat.getTimeInstance(SHORT,locales[i]);
      df[i * 8 + 5] = DateFormat.getTimeInstance(MEDIUM,locales[i]);
      df[i * 8 + 6] = DateFormat.getTimeInstance(LONG,locales[i]);
      df[i * 8 + 7] = DateFormat.getTimeInstance(FULL,locales[i]);
    }
    for (int i = 0; i < locales.length; i++) {
      String tip = i == 0 ? "----中國日期格式----" : "----美國日期格式----";
      System.out.println(tip);
      System.out.println("SHORT格式的日期格式:" + df[i * 8].format(dt));
      System.out.println("MEDIUM格式的日期格式:" + df[i * 8 + 1].format(dt));
      System.out.println("LONG格式的日期格式:" + df[i * 8 + 2].format(dt));
      System.out.println("FULL格式的日期格式:" + df[i * 8 + 3].format(dt));
      System.out.println("SHORT格式的時間格式:" + df[i * 8 + 4].format(dt));
      System.out.println("MEDIUM格式的時間格式:" + df[i * 8 + 5].format(dt));
      System.out.println("LONG格式的時間格式:" + df[i * 8 + 6].format(dt));
      System.out.println("FULL格式的時間格式:" + df[i * 8 + 7].format(dt));
    }
  }
}

上面程式共建立了16個 DateFormat 物件,分別為中國、美國兩個 Locale 各建立8個 DateFormat 物件,分別是 SHORT、MEDIUM、LONG、FULL 四種樣式的日期格式器、時間格式器。執行上面程式,會看到如下所示的效果。

----中國日期格式----
SHORT格式的日期格式:20-2-11
MEDIUM格式的日期格式:2020-2-11
LONG格式的日期格式:2020年2月11日
FULL格式的日期格式:2020年2月11日 星期二
SHORT格式的時間格式:下午2:26
MEDIUM格式的時間格式:14:26:21
LONG格式的時間格式:下午02時26分21秒
FULL格式的時間格式:下午02時26分21秒 CST

----美國日期格式----
SHORT格式的日期格式:2/11/20
MEDIUM格式的日期格式:Feb 11,2020
LONG格式的日期格式:February 11,2020
FULL格式的日期格式:Tuesday,February 11,2020
SHORT格式的時間格式:2:26 PM
MEDIUM格式的時間格式:2:26:21 PM
LONG格式的時間格式:2:26:21 PM CST
FULL格式的時間格式:2:26:21 PM CST

DateFormat 具有國際化的能力,同一個日期使用不同的 Locale 格式器格式化的效果完全不同,格式化後的字串正好符合 Locale 對應的本地習慣。

獲得了 DateFormat 之後,還可以呼叫它的 setLenient(boolean lenient) 方法來設定該格式器是否採用嚴格語法。舉例來說,如果採用不嚴格的日期語法(該方法的引數為true),對於字串"2004-2-31"將會轉換成2004年3月2日:如果採用嚴格的日期語法,解析該字串時將丟擲異常。

DateFormat 的 parse() 方法可以把一個字串解析成 Date 物件,但它要求被解析的字串必須符合日期字串的要求,否則可能丟擲 ParseExcepuon 異常。例如,如下程式碼片段:

String str1 = "2017/10/07";
String str2 = "2017年10月07日";
// 下面輸出 Sat Oct 07 00:00:00 CST 2017
System.out.println(DateFormat.getDateInstance().parse(str2));
// 下面輸出 Sat Oct 07 00:00:00 CST 2017
System.out.println(DateFormat.getDateInstance(SHORT).parse(str1));
// 下面丟擲 ParseException異常
System.out.println(DateFormat.getDateInstance().parse(str1));

上面程式碼中最後一行程式碼解析日期字串時引發 ParseException 異常,因為"2017/10/07"是一個 SHORT 樣式的日期字串,必須用 SHORT 樣式的 DateFormat 例項解析,否則將丟擲異常。

使用 SimpleDateFormat 格式化日期

前面介紹的 DateFormat 的方法可以把字串解析成 Date 物件,但實際上 DateFormat 的 parse() 方法不夠靈活一一它要求被解析的字串必須滿足特定的格式!為了更好地格式化日期、解析日期字串,Java 提供了 SimpleDateFormat 類。

SimpleDateFormat 是 DateFormat 的子類,正如它的名字所暗示的,它是“簡單”的日期格式器。很多讀者對“簡單”的日期格式器不屑一顧,實際上 SimpleDateFormat 比 DateFormat 更簡單,功能更強大。

SimpleDateFormat 可以非常靈活地格式化 Date,也可以用於解析各種格式的日期字串。建立 SimpleDateFormat 物件時需要傳入一個 pattern 字串,這個 pattern 不是正則表示式,而是一個日期模板字串。

import java.text.*;
import java.util.*;

public class SimpleDateFormatTest {
  public static void main(String[] args) throws ParseException {
    Date d = new Date();
    // 建立一個SimpleDateFormat物件
    SimpleDateFormat sdf1 = new SimpleDateFormat("Gyyyy年中第D天");
    // 將d格式化成日期,輸出:公元2017年中第282天
    String dateStr = sdf1.format(d);
    System.out.println(dateStr);
    // 一個非常特殊的日期字串
    String str = "14###3月##21";
    SimpleDateFormat sdf2 = new SimpleDateFormat("y###MMM##d");
    // 將日期字串解析成日期,輸出:Fri Mar 21 00:00:00 CST 2014
    System.out.println(sdf2.parse(str));
  }
}

從上面程式中可以看出,使用 SimpleDateFormat 可以將日期格式化成形如“公元2014年中第101天”這樣的字串,也可以把形如“14###3月##21”這樣的字串解析成日期,功能非常強大。

SimpleDateFormat 把日期格式化成怎樣的字串,以及能把怎樣的字串解析成 Date,完全取決於建立該物件時指定的 pattern 引數,pattern 是一個使用日期欄位佔位符的日期模板。

如果讀者想知道 SimpleDateFormat 支援哪些日期、時間佔位符,可以查閱 API 文件中 SimpleDateFormat 類的說明,此處不再贅述。

Java 8 新增的日期、時間格式器

Java 8 新增的日期、時間 API 裡不僅包括了 Instant、LocalDate、LocalDateTime、LocalTime 等代表日期、時間的類,而且在 java.time.format 包下提供了一個 DateTimeFormatter 格式器類,該類相當於前面介紹的 DateFormat 和 SimpleDateFormat 的合體,功能非常強大。

與 DateFormat、SimpleDateFormat 類似,DateTimeFormatter 不僅可以將日期、時間物件格式化成字串,也可以將特定格式的字串解析成日期、時間物件。

為了使用 DateTimeFormatter 進行格式化或解析,必須先獲取 DateTimeFormatter 物件,獲取 DateTimeFormatter 物件有如下三種常見的方式。

  • 直接使用靜態常量建立 DateTimeFormatter 格式器。DateTimeFormatter 類中包含了大量形如 ISO_LOCAL_DATE、ISO_LOCAL_TIME、ISO_LOCAL_DATE_TIME 等靜態常量,這些靜態常量本身就是 DateTimeFormatter 例項。
  • 使用代表不同風格的列舉值來建立 DateTimeFormatter 格式器。在 FormatStyle 列舉類中定義了 FULL、LONG、MEDIUM、SHORT 四個列舉值,它們代表日期、時間的不同風格。
  • 根據模式字串來建立 DateTmeFormatter 格式器。類似於 SimpleDateFormat,可以採用模式字串來建立 DateTimeFormatter,如果需要了解支援哪些模式字串,則需要參該類的 API 文件。

使用 DateTimeFormatter 完成格式化

使用 DateTimeFormatter 將日期、時間(LocalDate、LocalDateTime、LocalTime等例項)格式化為字串,可通過如下兩種方式。

  • 呼叫 DateTimeFormatter 的 format(TemporalAccessor temporal) 方法執行格式化,其中 LocalDate、LocalDateTime、LocalTime 等類都是 TemporalAccessor 介面的實現類。
  • 呼叫 LocalDate、LocalDateTime、LocalTime 等日期、時間物件的 format(DateTimeFormatter formatter) 方法執行格式化。

上面兩種方式的功能相同,用法也基本相似,如下程式示範了使用 DateTimeFormatter 來格式化日期、時間。

import java.time.*;
import java.time.format.*;

public class NewFormatterTest{
  public static void main(String[] args){
    DateTimeFormatter[] formatters = new DateTimeFormatter[]{
      // 直接使用常量建立DateTimeFormatter格式器
      DateTimeFormatter.ISO_LOCAL_DATE,DateTimeFormatter.ISO_LOCAL_TIME,DateTimeFormatter.ISO_LOCAL_DATE_TIME,// 使用本地化的不同風格來建立DateTimeFormatter格式器
      DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL,FormatStyle.MEDIUM),DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG),// 根據模式字串來建立DateTimeFormatter格式器
      DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
    };
    LocalDateTime date = LocalDateTime.now();
    // 依次使用不同的格式器對LocalDateTime進行格式化
    for(int i = 0 ; i < formatters.length ; i++){
      // 下面兩行程式碼的作用相同
      System.out.println(date.format(formatters[i]));
      System.out.println(formatters[i].format(date));
    }
  }
}

上面程式使用三種方式建立了6個 DateTimeFormatter 物件,然後程式中兩行粗體字程式碼分別使用不同方式來格式化日期。執行上面程式,會看到如下所示的效果。

2020-02-11
2020-02-11
17:13:00.303
17:13:00.303
2020-02-11T17:13:00.303
2020-02-11T17:13:00.303
2020年2月11日 星期二 17:13:00
2020年2月11日 星期二 17:13:00
2020年2月11日
2020年2月11日
公元2020%%二月%%11 17:13:00
公元2020%%二月%%11 17:13:00

可以看出,使用 DateTimeFormatter 進行格式化,也可使用模式字串對日期、時間進行自定義格式化,由此可見,功能完全覆蓋了傳統的 DateFormat、SimpleDateFormate 的功能。

提示:有些時候,讀者可能還需要使用傳統的 DateFormat 來執行格式化,DateTimeFormatter 則提供了一個 toFormat() 方法,該方法可以獲取 DateTimeFormatter 對應的 Format 物件。

使用 DateTimeFormatter 解析字串

為了使用 DateTimeFormatter 將指定格式的字串解析成日期、時間物件(LocalDate、LocalDateTime、LocalTime 等例項),可通過日期、時間物件提供的 parse(CharSequence text,DateTimeFormatter formatter) 方法進行解析。

如下程式示範了使用 DateTimeFormatter 解析日期、時間字串。

import java.time.*;
import java.time.format.*;

public class NewFormatterParse {
  public static void main(String[] args) {
    // 定義一個任意格式的日期時間字串
    String str1 = "2014==04==12 01時06分09秒";
    // 根據需要解析的日期、時間字串定義解析所用的格式器
    DateTimeFormatter fomatter1 = DateTimeFormatter.ofPattern("yyyy==MM==dd HH時mm分ss秒");
    // 執行解析
    LocalDateTime dt1 = LocalDateTime.parse(str1,fomatter1);
    System.out.println(dt1); // 輸出 2014-04-12T01:06:09
    // ---下面程式碼再次解析另一個字串---
    String str2 = "2014$$$4月$$$13 20小時";
    DateTimeFormatter fomatter2 = DateTimeFormatter.ofPattern("yyy$$$MMM$$$dd HH小時");
    LocalDateTime dt2 = LocalDateTime.parse(str2,fomatter2);
    System.out.println(dt2); // 輸出 2014-04-13T20:00
  }
}

上面程式中定義了兩個不同格式的日期、時間字串,為了解析它們,程式分別使用對應的格式字串建立了 DateTmeFormatter 物件,這樣 DateTimeFormatter 即可按該格式字串將日期、時間字串解析成 LocalDateTime 物件。編譯、執行該程式,即可看到兩個日期、時間字串都被成功地解析成 LocalDateTime。

以上就是JAVA 格式化日期、時間的方法的詳細內容,更多關於JAVA 格式化日期、時間的資料請關注我們其它相關文章!