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月/日/年01/15/20
T24小时的时:分:秒15:46:40
t12小时的时:分:秒 上午/下午03:46:40 pm
R24小时的时:分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
H24小时制的小时(两位数,补0,00~23)08
k24小时制的小时(两位数,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
PAM/PM(中文时间报错,使用p)PM
pAM/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提取上下午的大写的时候就无法提取,所以自然会整体报错,有兴趣的同学可以根据报错的信息,由底向上地研究一下处理过程。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值