0

我正在使用与 Java Wicket webapp 集成的 fullcalendar。

当网络浏览器的时区与服务器的时区不同时,我遇到了日期问题。

例如:Cayenne (UMT -3) 的 webbrowser 和 Paris (UMT +1) 的服务器。

我使用fullcalendar的“ignoreTimeZone = true”,因为我想保留webbrowser用户的时区数据库日历。

服务器初始化日历时:从巴黎发送到卡宴的事件

服务器发送这样的事件

{"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 点钟时间,从 webbrowser 发送的 JSON 值是正确的

allDay 假日期“2011-01-07T15:00:00.000Z”反馈为“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 fomat 格式化"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 回答