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
kk:(01-24)01、02..24のようになります。
HH:(00-23)は00、01..23のようになります。
hh:(AM/PMの01-12)は01、02..12のようになります。
したがって、最後の印刷(working2
)は少し奇妙です。 12:00:00(編集:working2
タイムゾーンとフォーマットを設定していた場合、(kdagliが指摘したように)あなたはそうではありません)
実際、最後のものは奇妙ではありません。コードは、working2ではなくworkingのタイムゾーンを設定しています。
SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss");
working.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
これがユーザーに時刻を表示するためのものである場合、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日時APIであるJava.timeを使用します。一緒に作業する方がずっといいです。
もちろん、指定された形式で文字列を解析する必要がある場合、および非常に特定の形式要件がある場合は、形式パターン文字列を使用することをお勧めします。実際には、時間から選択する4つの異なるパターン文字があります(ドキュメントから引用)。
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
先行ゼロが必要ない場合は、パターン文字を1つだけ指定します。つまり、h
の代わりにhh
またはH
の代わりにHH
です。解析時に2桁を受け入れ、印刷される数値が9より大きい場合、2桁が印刷されます。
DateTimeFormatter
のドキュメント 。h/H = 12/24時間は、hh:mm = 12時間形式とHH:mm = 24時間形式を書くことを意味します