2011-01-06 6 views
0

Ich verwende Vollkalender integriert mit Java Wicket Webapp.FullCalendar kann aktualisiert werden, um ignoreTimeZone vom Webbrowser zum Server zu haben?

Ich habe ein Problem mit dem Datum, wenn die Zeitzone des Webbrowsers von der Zeitzone des Servers abweicht.

Zum Beispiel: Webbrowser bei Cayenne (UMT -3) und Server in Paris (UMT +1).

Ich benutze "ignoreTimeZone = true" von fullcalendar, weil ich im Datenbankkalender der Zeitzone des Benutzers von webbrowser behalten möchte.

Wenn Server initialize Kalender: Ereignisse von Paris sended nach Cayenne

Server senden Veranstaltungen wie diese

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

Mit ignoreTimeZone = true ist es ok. Wir haben 9 Uhr im Kalender.

Um zu überprüfen, habe ich mit ignoreTimeZone = false getestet. Ich habe richtig bei 5 Uhr positioniert (9 - 4 = 5).

Problem tritt auf, wenn der Benutzer auf einen Tag klickt, um ein neues Ereignis zu erstellen!

Für 12 Uhr Zeit dann Wert JSON von Web-Browser gesendet korrekt

Allday falsch date "2011-01-07T15: 00: 00.000Z" feedbackFor "dayClick"

Aber wenn ich Ich möchte lieber 2011-01-07T12: 00: 00: 000-03: 00 Format oder nur 2011-01-07T12: 00: 00.000

haben Ist es möglich, dies zu haben neue Möglichkeit?

Vielen Dank für Ihre Antwort.

+0

ich mehr haben Javascript-Code zu untersuchen und ich finded das ist ein zusätzlicher JavaScript, das Feld Datum von dayClick Struktur zu JSON String in ISO8601 Z-Format konvertieren. Ich habe diesen Teil des Codes geändert, um in ISO8601 mit TimeZone relativ +/- HH: MM zu konvertieren und es ist was ich will. Wahrscheinlich ist es keine gute Idee, aber in dieser Version ist es das, was ich will. –

Antwort

1

Meine Lösung sendet immer Ereignisse vom Server mit UNIX-Zeitstempel oder UTC-Datumsformat aus dem FullCalendar des Clients.

Zunächst werden die Ereignisse vom Client mit Jquery-json-Plugin gesendet werden, wie

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) 
}); 

Die Veranstaltung in $ .toJSON serialisiert() wird mit UTC fomat "yyyy-MM-dd'T'HH:mm:ss'Z'" formated werden.

Dann können Sie Gson und jodatime verwenden, um das UTC-Format Datum

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); 
     } 
    } 

}; 

Zweitens zeigen das Datum mit org.apache.wicket.datetime.markup.html.form.DateTextField oder org.apache.wicket.datetime.markup.html.basic.DateLabel zu analysieren.

mit Kundenzeitzone Problem umgehen, fügen Sie diese an Ihre 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); 

Ereignisse Schließlich Abfrage vom Server und sendet an Kunden FullCalendar mit UNIX-Zeitstempel.

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

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

Produziert jsons sind wie diese

[{"id":"1","title":"test1","allDay":true,"start":1299805200,"end":1299807000,"editable":false}, 
{"id":"2","title":"test2","allDay":false,"start":1299805200,"end":1299807000,"editable":true}]