使用内置的本地化格式
如果这是为了向用户显示一天中的某个时间,那么在 20 个中至少有 19 个不需要关心kk
,HH
也不需要关心hh
。我建议你使用这样的东西:
DateTimeFormatter defaultTimeFormatter
= DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
System.out.format("%s: %s%n",
Locale.getDefault(), LocalTime.MIN.format(defaultTimeFormatter));
关键是它在不同的默认语言环境中提供不同的输出。例如:
en_SS: 12:00 AM
fr_BL: 00:00
ps_AF: 0:00
es_CO: 12:00 a.m.
本地化格式的设计符合不同文化的期望。因此,它们通常会为用户提供更好的体验,并且可以省去您编写格式模式字符串的麻烦,这总是容易出错的。
我进一步建议您不要使用SimpleDateFormat
. 这个类是出了名的麻烦,幸运的是已经过时了。相反,我使用 java.time,现代 Java 日期和时间 API。与它一起工作要好得多。
小时的四个模式字母:H、h、k 和 K
当然,如果您需要解析具有指定格式的字符串,并且如果您有非常具体的格式要求,最好使用格式模式字符串。小时实际上有四种不同的模式字母可供选择(引用自文档):
Symbol Meaning Presentation Examples
------ ------- ------------ -------
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-day (1-24) number 24
H hour-of-day (0-23) number 0
在实践中H
并被h
使用。据我所知k
并且K
不是(为了完整起见,它们可能只是被包括在内)。但让我们看看它们都在行动:
DateTimeFormatter timeFormatter
= DateTimeFormatter.ofPattern("hh:mm a HH:mm kk:mm KK:mm a", Locale.ENGLISH);
System.out.println(LocalTime.of(0, 0).format(timeFormatter));
System.out.println(LocalTime.of(1, 15).format(timeFormatter));
System.out.println(LocalTime.of(11, 25).format(timeFormatter));
System.out.println(LocalTime.of(12, 35).format(timeFormatter));
System.out.println(LocalTime.of(13, 40).format(timeFormatter));
12:00 AM 00:00 24:00 00:00 AM
01:15 AM 01:15 01:15 01:15 AM
11:25 AM 11:25 11:25 11:25 AM
12:35 PM 12:35 12:35 00:35 PM
01:40 PM 13:40 13:40 01:40 PM
如果您不想要前导零,只需指定一个模式字母,即h
代替hh
或H
代替HH
。解析时仍然会接受两位数,如果要打印的数字大于9,仍然会打印两位数。
链接