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 | 月/日/年 | 01/15/20 |
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提取上下午的大写的时候就无法提取,所以自然会整体报错,有兴趣的同学可以根据报错的信息,由底向上地研究一下处理过程。