なぜ「23:00PM」をSimpleDateFormat("hh:mm aa")
午前11時に解析するのですか?
6 に答える
「23:00PM」は有効な文字列ではないため、例外が発生するはずですが、日付解析を処理する場合、Javaの日付/時刻機能はデフォルトで寛大です。
ロジックは、午後23:00は午後11:00の12時間後、つまり翌日の午前11:00であるというものです。また、「4月31日」が「5月1日」(4月30日の翌日)として解析されていることもわかります。
この動作を望まない場合は、DateFormat#setLenient(boolean)を使用してSimpleDateFormatのlenientプロパティをfalseに設定すると、無効な日付/時刻を渡すときに例外が発生します。
24時間制を解析する場合は、フォーマットとして「HH:mmaa」が必要です。
public static void main(String[] args) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("HH:mm aa");
final Date date = df.parse("23:00 PM");
System.out.println("date = " + df.format(date));
}
出力
date = 23:00 PM
試しましたHH:mm aa
か?
HH
は24時間、hh
は12時間です。
javadocで指定されているフォーマットオプションは次のとおりです
H Hour in day (0-23)
k Hour in day (1-24)
K Hour in am/pm (0-11)
h Hour in am/pm (1-12)
「h」は1〜12時間であることに注意してください。1〜24を処理する場合は、「k」を試してください。0〜23の場合は、「H」を試してください。しかし、不可能なデータを入力している場合、有効な結果は期待できません。
午後23:00は、翌日の午前11時と考えることができます。JavascriptとPHPはこのように機能しますが、Javaについて話すことはできません。
私はそれが次のようなことをすると思います:
hours = hours % 12;
時間が適切な範囲内にあることを確認します。