66

kk:mm、HH:mm 和 hh:mm 格式有什么区别??

    SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss");
    broken.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    SimpleDateFormat working = new SimpleDateFormat("HH:mm:ss");
    working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss");
    working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

    System.out.println(broken.format(epoch));
    System.out.println(working.format(epoch));
    System.out.println(working2.format(epoch));

印刷:

24:00:00
00:00:00
05:30:00
4

5 回答 5

74

kk: (01-24) 看起来像 01, 02..24。

HH:(00-23) 看起来像 00, 01..23。

hh:(上午/下午的 01-12)看起来像 01、02..12。

所以最后的打印输出 ( working2) 有点奇怪。它应该说 12:00:00 (编辑:如果你正在设置working2时区和格式,(正如 kdagli 指出的那样)你不是)

于 2013-06-27T11:00:10.430 回答
28

请看这里

HH 是一天中的小时(从 0 到 23)

hh 是上午/下午格式的小时数

kk 是一天中的小时(从 1 到 24)

mm 是小时中的分钟

ss 是一分钟内的秒数

于 2013-06-27T10:56:54.270 回答
19

其实最后一个并不奇怪。代码正在设置工作时区而不是工作2。

SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss"); 在职的.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

kk 从 1 到 24,HH 从 0 到 23,hh 从 1 到 12 (AM/PM)。

修复此错误给出:

24:00:00
00:00:00
01:00:00
于 2014-01-30T10:24:38.497 回答
4

使用内置的本地化格式

如果这是为了向用户显示一天中的某个时间,那么在 20 个中至少有 19 个不需要关心kkHH也不需要关心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代替hhH代替HH。解析时仍然会接受两位数,如果要打印的数字大于9,仍然会打印两位数。

链接

于 2019-02-21T11:56:51.673 回答
4

h/H = 12/24 小时意味着您将编写 hh:mm = 12 小时格式和 HH:mm = 24 小时格式

于 2018-09-04T15:32:37.703 回答