Java System.out.printf格式化輸出日期

printf 方法可以很輕鬆地格式化時間和日期。使用兩個字母格式,它以 %t 開頭並且以下面表格中的一個字母結尾。當我們需要一個固定格式的日期輸出的時候,需要利用printf格式化輸出字符串的功能,並在秦鍾指出要被格式化的參數的索引。索引必須緊跟在%後面,而且必須以$結束。

可能對於初學者,上面的話比較抽象,我們來介紹一個實例。

Date today = new Date();
System.out.printf("%tc%n", today);
System.out.printf("%1$s %2$tB %2$td, %2$tY %2$ta%n","Due date:", today);

輸出的內容如下,第一個輸出是標準的完整格式的日期,第二個是按照我們指定的格式進行輸出的內容。可以看出,第二個printf裏有三個參數,分別是0:我們指定的格式內容、1:“Due date”、2:today。索引是這三個參數對應不同序號的內容,而必須在%和$之間。$後面是我們指定的格式,由t和下面表格當中的內容共同組成。

 

轉換符 類型 舉例
c 完整的日期和時間 星期一 四月 22 15:46:40 CST 2019
F 年-月-日 2019-04-22
D 年/月/日 2019/04/22
T 24小時的時:分:秒 15:46:40
t 12小時的時:分:秒 上午/下午 03:46:40 pm
R 24小時的時:分 15:46
Y 年(四位,不滿前面補0) 2019
y 年後兩位(不滿前面補0) 19
C 年前兩位(不滿前面補0) 20
B 月(英文的完整拼寫或者中文月) April或者四月
b或者h 月縮寫(中文同B) Apr
m 兩位數字的月(不滿前面補0) 04
d 兩位數字的日(不滿前面補0) 22
e 月(不補0) 4
A 周幾(英文的完整拼寫或者中文月) Monday或者週一
a 周幾縮寫(中文同A) Mon或者週一
j 一年中的第幾天(三位數,001~366) 112
H 24小時制的小時(兩位數,補0,00~23) 08
k 24小時制的小時(兩位數,00~23) 15
I(大寫i) 11小時制的小時(兩位數,補0,00~11) 03
l(小寫L) 11小時制的小時(兩位數,00~11) 3
M 分鐘(兩位數,補0,00~59) 40
S 分鐘(兩位數,00~59) 40
L 三位數毫秒(補0) 027
N 九位數毫微秒(補0) 027000000
P AM/PM(中文時間報錯,使用p) PM
p AM/PM/上午/下午 PM或者下午
z 從FMT開始,RFC822數字位移 +0800
Z 時區 CST
s 從格林威治時間1970-01-01 00:00:00起的秒數 1555920782
Q 從格林威治時間1970-01-01 00:00:00起的毫秒數 1555920782076

    我們可以通過String.format來獲得任意語言的時間,比如如果你係統輸出的時間是英文你可以把它轉換成中文。比如:

Date today = new Date();
String str = String.format(Locale.ENGLISH,"%tc",today);
System.out.println(str);

    輸出結果如下,我們將原本的中文的輸出內容轉換成了英文:

    注意這裏的P很特殊,如果你通過c輸出的內容有中文內容,那麼即使你通過String.format的方式也無法獲得大寫英文的上下午時間,例子如下:

Date today = new Date();
String str = String.format(Locale.ENGLISH,"%tP",today);
System.out.println(str);

    報錯信息

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'tP'
	at java.util.Formatter$FormatSpecifier.checkDateTime(Formatter.java:2963)
	at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2723)
	at java.util.Formatter.parse(Formatter.java:2560)
	at java.util.Formatter.format(Formatter.java:2501)
	at java.util.Formatter.format(Formatter.java:2455)
	at java.lang.String.format(String.java:2981)
	at HelloWorld.main(HelloWorld.java:88)

    原因很簡單,我們“Ctrl+鼠標左鍵”看一下String.format的實現

    public static String format(Locale l, String format, Object... args) {
        return new Formatter(l).format(format, args).toString();
    }

    它是先進行信息提取,然後再轉換成指定的語言格式,因爲我們系統的時間是中文,所以這裏在使用tP提取上下午的大寫的時候就無法提取,所以自然會整體報錯,有興趣的同學可以根據報錯的信息,由底向上地研究一下處理過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章