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と同じ挙動となった。