0

Java Wicket webapp と統合された fullcalendar を使用しています。

ウェブブラウザのタイムゾーンがサーバーのタイムゾーンと異なる場合、日付に問題があります。

例: カイエンの Web ブラウザー (UMT -3) とパリのサーバー (UMT +1)。

Webブラウザのユーザーのタイムゾーンのカレンダーをデータベースに残したいので、fullcalendarの「ignoreTimeZone=true」を使用します。

サーバーがカレンダーを初期化するとき: パリからカイエンに送信されるイベント

サーバーはこのようなイベントを送信します

{"id":"53922","title":"0123456789","allDay":false,"start":"2011-01-06T09:00:00.000+01:00"}

ignoreTimeZone=true で問題ありません。カレンダーでは9時です。

確認するために、ignoreTimeZone=false でテストしました。イベントを 5 時 (9 - 4 = 5) に正しく配置しました。

ユーザーが日をクリックして新しいイベントを作成すると、問題が発生します!

12 時の時刻の場合、Web ブラウザから送信された JSON 値は正しいです

allDay false date "2011-01-07T15:00:00.000Z" feedbackFor "dayClick"

しかし、ignoreTimeZone から同等のものを取得したい場合は、2011-01-07T12:00:00:000-03:00 形式または単に 2011-01-07T12:00:00.000 を使用することをお勧めします

この新しい可能性を持つことは可能ですか?

ご回答ありがとうございます。

4

1 に答える 1

1

私の解決策は、常にクライアントの FullCalendar から UNIX タイムスタンプまたは UTC 日付形式でサーバーからイベントを送信することです。

まず、jquery-json プラグインを使用してクライアントから送信されたイベントは次のようになります。

var event ={"startDate" : startDate, "endDate" : endDate,"allDay" : allDay};
$.ajax({
  url : "${feedbackURL}", type: 'POST', contentType: 'application/json;charset=UTF-8'
 ,dataType: (($.browser.msie) ? "text" : "xml"), data : $.toJSON(event)
});

$.toJSON() でシリアル化されたイベントは、UTC format でフォーマットされます"yyyy-MM-dd'T'HH:mm:ss'Z'"

次に、gson と jodatime を使用して UTC 形式の日付を解析できます

private static final DateTimeFormatter UTC_FORMAT = DateTimeFormat
        .forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZone(DateTimeZone.UTC);

public static final JsonDeserializer<Date> DATE_DESERIALIZER = new JsonDeserializer<Date>() {

    /**
     * @see org.apache.wicket.datetime.DateConverter#convertToObject(String,
     *      java.util.Locale)
     */
    @Override
    public Date deserialize(final JsonElement json, final Type typeOfT,
            final JsonDeserializationContext context)
            throws JsonParseException {
        String value = json.getAsString().replace(".000", "");
        try {
            MutableDateTime dt = UTC_FORMAT.parseMutableDateTime(value);

            return dt.toDate();
        } catch (final Exception e) {
            LOG.debug("Date parsing error", e);
            throw new ConversionException(e);
        }
    }

};

次に、org.apache.wicket.datetime.markup.html.form.DateTextFieldまたはで日付を表示しますorg.apache.wicket.datetime.markup.html.basic.DateLabel

クライアントのタイムゾーンの問題に対処するには、これらをApplication

// always set your application's DateTimeZone to UTC
TimeZone.setDefault(TimeZone.getTimeZone("etc/UTC"));
DateTimeZone.setDefault(DateTimeZone.UTC);
// detect client's timezone in the WebClientInfo
getRequestCycleSettings().setGatherExtendedBrowserInfo(true);

最後に、サーバーからクエリを実行し、UNIX タイムスタンプを使用してクライアントの FullCalendar にイベントを送信します。

//Java
long toTimestamp(final Date date) {
return date.getTime() / 1000;
}

Date fromTimestamp(final long timestamp) {
return new Date(timestamp * 1000);
}

生成されたjsonはこのようなものです

[{"id":"1","title":"test1","allDay":true,"start":1299805200,"end":1299807000,"editable":false},
{"id":"2","title":"test2","allDay":false,"start":1299805200,"end":1299807000,"editable":true}]
于 2011-03-13T11:50:49.557 に答える