本日のお裾分け

日々の開発で得た知識をシェアします。Java/Scala/Ruby/javascript

【JSF】f:convertDateTimeでtimeZoneを指定しないと-9時間される

本日のお裾分けです。

JSFでf:convertDateTimeを使うくらいなら、PrimeFacesのp:calendarを使った方が良いんじゃないかという話。

JSFでDate型を画面に表示する際、
元から用意されてるf:convertDateTimeはtimeZoneを指定しないと、グリニッジ標準時(GMT)に合わせてしまう(空気の読めない)仕様らしいです。
つまり日本のサーバーだとマイナス9時間されて前日になりますw
こんな感じ。

SampleBean.java
@ManagedBean(name = "sample")
public class sampleBean {

    //初期化で2015-10-10 00:00:00をセットする。
    @Getter @Setter private Date date;

    @PostConstruct
    public void init() {
        String dateStr = "20151010 00:00:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
        try {
            this.date = sdf.parse(dateStr);
        } catch (ParseException ex) {
            throw new RuntimeException();
        }
    }
}

↑のBeanで詰めた2015年10月10日の00時00分00秒をf:convertDateTimetとp:calendarで出力します↓(どちらもtimeZoneはつけない)

sample.xhtml
    <h:body>
        <p:inputText value="#{sample.date}" >
            <f:convertDateTime pattern="yyyy/MM/dd  HH:mm:ss"/>
        </p:inputText>
        <br/>
        <p:calendar value="#{sample.date}" pattern="yyyy/MM/dd  HH:mm:ss"/>
    </h:body>

結果はこんな感じ。別の日になっとる。。。。
f:id:mrdShinse:20151024175057j:plain
*1

これ、f:convertDateTimeにtimeZone属性をつければ正しくフォーマットされた日付が出るんですが、だるい。簡単にモレそうだし。一応↓で同じ日付が表示される。

            <f:convertDateTime pattern="yyyy/MM/dd  HH:mm:ss" timeZone="JST"/>

PrimeFaces(UIコンポーネント ライブラリ)のp:calendarタグなら、timeZoneを指定しなくてもBeanと同じ値を出してくれるみたいだし、入力支援も付くのでこっち使った方が断然いいよという話でした。おわり。
参考URL
java - JSF convertDateTime renders the previous day - Stack Overflow
PrimeFaces ShowCase


追記。
POM載せ忘れてた。

POM.xml
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>5.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.6</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>


他にはこんな記事を書いています^^
mrdshinse.hatenablog.com

*1:f:convertDateTimeは9時間マイナスされて10月9日になってます。