TimeZoneとLocale
いろいろ考えるところがあり、GAE/JのTimeZoneとLocaleを調べてみた。
ローカル
TimeZone
sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Locale
ja_JP
appspot
TimeZone
sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Locale
en_US
こんな感じで、想像していた通りだった。
そもそもクラウドで日本時間のはずがない。
で、日本で利用するアプリだと何かと使い勝手が悪いので、変更してみることにした。
まずはTimeZoneから。
Filterで以下のコードを実行する。
TimeZone.setDefault("Asia/Tokyo");
ローカル
sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
appspot
sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
つづいてLocale。
TimeZoneと同様にFilterで以下のコードを実行。
Locale.setDefault(Locale.JAPAN);
ローカル
ja_JP
appspot
以下のようなエラーが発生した。
Nested in javax.servlet.ServletException: java.security.AccessControlException: access denied (java.util.PropertyPermission user.language write):
java.security.AccessControlException: access denied (java.util.PropertyPermission user.language write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:355)
at java.security.AccessController.checkPermission(AccessController.java:567)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at com.google.apphosting.runtime.security.CustomSecurityManager.checkPermission(CustomSecurityManager.java:45)
at java.util.Locale.setDefault(Unknown Source)
結論
TimeZoneは変更できる。
Calendar#getInstanceしている箇所の修正はとりあえず不要?
Localeはローカルでは変更できるが、appspotではAccessControlExceptionが発生する。
個別に指定すればいいはず。めんどくさい&抜けが発生しそう。
12/28追記
slim3のFrontControllerでLocaleの指定ができることを知ったので試してみた。
ローカルは反映されるが、appspotでは反映されない。独自Filterと同じ挙動となった。