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提取上下午的大寫的時候就無法提取,所以自然會整體報錯,有興趣的同學可以根據報錯的信息,由底向上地研究一下處理過程。