【JavaEE】xhtmlの日付型フォーマットのやり方(h:outputFormat+f:paramの型対応・number書式例付き)

2025年5月9日

とてぃです。

本日はJavaEEのxhtmlでの日付型の表示について、特にh:outputFormatf:paramを使った数値フォーマット(ゼロ埋め)や型対応の方法を詳しく解説します。
これまでJava側で日付を文字列変換していましたが、xhtml側で柔軟にフォーマットできる方法を紹介します。

h:outputFormat+f:paramで日付や数値を柔軟にフォーマット

JSFの<h:outputFormat>タグと<f:param>タグを組み合わせることで、複数の値を柔軟にフォーマットできます。特にnumber書式を使えば、ゼロ埋めや桁数指定も可能です。

例:4桁年・2桁月のゼロ埋め表示

<h:outputFormat value="{0,number,0000}/{1,number,00}">
  <f:param value="#{bean.year}" />
  <f:param value="#{bean.monthly}" />
</h:outputFormat>

この例では、bean.yearbean.monthlyの値をそれぞれ4桁・2桁のゼロ埋めで表示します。たとえば「2025/05」のような表示になります。

ポイント

  • {0,number,0000}は4桁ゼロ埋め、{1,number,00}は2桁ゼロ埋め
  • bean.yearbean.monthlyLocalDateTime型やint型、String型でもOK
  • 数値型(int/Integer/longなど)はゼロ埋めされ、文字列型はそのまま表示される
  • 複数の値を組み合わせて柔軟にフォーマットできる

JSFのh:outputFormatは、内部的にJavaのjava.text.MessageFormatを使っており、numberdateなどの書式指定が可能です。

型対応(数値型・文字列型)について

  • 数値型(int, Integer, long, etc.):指定したnumber書式でゼロ埋めや桁数指定が適用されます。
  • 文字列型(String)number書式は適用されず、そのまま表示されます。
  • 日付型(LocalDate, LocalDateTimeなど)からgetYear()getMonthValue()で数値を取得して渡すのが一般的です。

例:LocalDateTime型から年・月を取得して渡す

// Java側
public int getYear() {
    return localDateTime.getYear();
}
public int getMonthly() {
    return localDateTime.getMonthValue();
}

サンプル:オブジェクト名でカラム指定

<h:outputFormat value="{0,number,0000}/{1,number,00}">
  <f:param value="#{格納したオブジェクト名.year}" />
  <f:param value="#{格納したオブジェクト名.monthly}" />
</h:outputFormat>

このように書けば、LocalDateTime型(日付型)から取得した年・月をゼロ埋めで表示できます。

正規表現による置換も補足

より柔軟な文字列変換やパターンマッチが必要な場合は、Java側で正規表現(String.replaceAll()Patternクラス)を使って加工し、xhtmlに渡す方法も有効です。

// 例:日付文字列の「-」を「/」に置換
public String getDateForView() {
    return dateString.replaceAll("-", "/");
}

ただし、ゼロ埋めや型ごとのフォーマットはxhtml側でh:outputFormatnumber書式を使う方が保守性が高いです。

まとめ

  • h:outputFormatf:paramで数値型・文字列型どちらも柔軟にフォーマット可能
  • {0,number,0000}のような書式でゼロ埋め・桁数指定も簡単
  • 日付型(LocalDateTime等)から年・月を取得して渡すのが実務的
  • 正規表現による文字列置換も用途によって活用
  • JSFの標準機能を使えば、Java側での変換ロジックが減り、メンテナンス性も向上

この方法を覚えておけば、日付や数値の表示で困ることはほとんどありません。
最後まで読んでいただきありがとうございました。

技術html,java

Posted by xxoruioxx