今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

JSONICでローカライズした日付データにエンコードする方法

JSONICは、デフォルトではDate型をlong値にエンコードする。この値をクライアント側のJavaScriptで取得しても、JavaScriptでは国際化対応が不十分なのでローカライズした日時の文字列に変換するのは難しい。
そもそもクライアント側で日時データをどうこうしてサーバー側に送信することってあんまりなくて、大半は受け取りっぱなし。
それならサーバー側でJSONにするときに、リクエストに設定されたLocaleにしたがってローカライズした文字列でエンコードしとけばだいたい間違いない。

というわけで、先日も書いたJSONを継承したクラスにコードを追加する。

public class JSON4Gae extends JSON {
    @Override
    protected Object preformat(Context context, Object value) throws Exception {
        if (value instanceof Text) {
            return ((Text)value).getValue();
        }
        if (value instanceof Date) {
            String format;
            if (context.getLocale().getLanguage().contains("ja")) {
                format = "yyyy年MM月dd日(E) HH:mm:ss";
            } else {
                format = "EEE, dd/MMM/yyyy HH:mm:ss";
            }
            SimpleDateFormat formatter = new SimpleDateFormat(format, context.getLocale());
            return formatter.format((Date)value);
        }
        return super.preformat(context, value);
    }

}

端末側の言語設定を切り替えるとリクエストにそのLocaleが設定されてくるので、そのLocaleを参照して日時をローカライズした文字列としてJSONに埋め込む。ここでは、"ja"を含んでいるかどうかでフォーマットを切り替えるようにした。