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

猜你喜欢

转载自blog.csdn.net/zhanggonglalala/article/details/89453073
今日推荐