【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>
結果はこんな感じ。別の日になっとる。。。。
*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日になってます。