2012-04-23 34 views
15

Mam funkcję, która musi działać w taki sam sposób zarówno na kliencie, jak i na serwerze, i formatuje daty.GWT: używaj DateTimeFormat na kliencie i SimpleDateFormat na serwerze

if (GWT.isClient()) 
{ 
    // Use DateTimeFormat 
} else { 
    // Use SimpleDateFormat 
} 

GWT narzeka: Nie Kod źródłowy jest dostępny dla typu SimpleDateFormat. Błąd nie jest krytyczny (przynajmniej w trybie dewelopera), ale denerwujący i nie ma możliwości jego powstrzymania. Znaleźliśmy podobne pytanie na http://groups.google.com/group/google-web-toolkit/browse_thread/thread/981247fca161c287. Nie sugerują one:

Możesz podać obojętne realizację supersource z SimpleDateTimeFormat tak że byłoby skompilować.

próbowałem. Teraz Eclipse narzeka:

java.text Deklarowany pakiet "java.text" nie pasuje oczekiwany pakiet "foo.jre.java.text" SimpleDateFormat.java

Odpowiedz

0

trzeba powiedzieć Eclipse, aby nie skompilować pliku Javy o super-źródłach. Jeśli używasz Mavena, jest to po prostu kwestia przeniesienia go do src/main/resources; w przeciwnym razie należy wykluczyć pakiet "jre" ze ścieżki budowania Eclipse.

... Powiedziałbym, że wolałbym super źródło klasy, która używa SimpleDateFormat/DateTimeFormat, i/lub przenieść ją do klasy pomocniczej, która byłaby super źródłem.

0
import java.util.Date; 

import com.google.gwt.core.shared.GWT; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtIncompatible; 

public abstract class DateTimeFormat 
{ 
    static DateTimeFormat getFormat(String pattern) 
    { 
     if (GWT.isClient()) 
      return DateTimeFormatClient.getFormat(pattern); 
     else 
      return DateTimeFormatServer.getFormat(pattern); 
    } 

    public abstract String format(Date date); 

    @GwtCompatible 
    private static class DateTimeFormatClient extends DateTimeFormat 
    { 
     private com.google.gwt.i18n.client.DateTimeFormat dateTimeFormat; 

     protected DateTimeFormatClient(String pattern) 
     { 
      this.dateTimeFormat = com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern); 
     } 

     public static DateTimeFormat getFormat(String pattern) 
     { 
      return new DateTimeFormatClient(pattern); 
     } 

     public String format(Date date) 
     { 
      return dateTimeFormat.format(date); 
     } 
    } 

    @GwtIncompatible("Server version of the class") 
    private static class DateTimeFormatServer extends DateTimeFormat 
    { 
     private java.text.SimpleDateFormat dateTimeFormat; 

     protected DateTimeFormatServer(String pattern) 
     { 
      this.dateTimeFormat = new java.text.SimpleDateFormat(pattern); 
     } 

     public static DateTimeFormat getFormat(String pattern) 
     { 
      return new DateTimeFormatServer(pattern); 
     } 

     public String format(Date date) 
     { 
      return dateTimeFormat.format(date); 
     }  

    } 
} 
+0

Czy ta potrzeba @GwtIncompatible z http://code.google.com/p/google-web-toolkit/source/detail?r=11570 została wydana? – fgb

+1

jest teraz wydany w GWT 2.6 (ale masz rację, nie było go w wersji 2.5.1 lub wcześniejszej) –

+1

Nie działa w GWT 2.7: 'Metoda getFormat (String) jest niezdefiniowana dla typu DateTimeFormat.DateTimeFormatServer' – stepancheg

27

Można użyć com.google.gwt.i18n.shared.DateTimeFormat zarówno serwera i klienta:

Wywołać chroniony konstruktor uniknąć GWT.create

String pattern = "yyyyMMdd"; /*your pattern here*/ 
DefaultDateTimeFormatInfo info = new DefaultDateTimeFormatInfo(); 
DateTimeFormat dtf = new DateTimeFormat(pattern, info) {}; // <= trick here 

Przykład

Date d = dtf.parse("20120301"); 
CalendarUtil.addDaysToDate(d, -1); 
String s = dtf.format(d); 
// s now contains "20120229" 

Sztuką jest wykonywana przez rozszerzenie DateTimeFormat, więc możemy użyć chronionego konstruktora z DateTimeFormatInfo gdzie używamy new DefaultDateTimeFormatInfo() aby uniknąć wywoływania z GWT.create

1

tego rozwiązania jest nieco inna, ale w tej samej ścieżce jednego @ochakov podane, ale to rozwiązuje problemu GWT 2.7 @stepancheg i wspominałem.

import java.util.Date; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtIncompatible; 

public abstract class DateTimeFormat { 
    static DateTimeFormat getFormat(String pattern) 
    { 
     if (GWT.isClient()) 
      return new DateTimeFormatClient(pattern); 
     else 
      return new DateTimeFormatServer(pattern); 
    } 

    public abstract String format(Date date); 

    public abstract Date parse(String dateString); 

    @GwtCompatible 
    private static class DateTimeFormatClient extends DateTimeFormat 
    { 
     protected String pattern; 

     public DateTimeFormatClient(String pattern) 
     { 
      this.pattern = pattern; 
     } 


     public String format(Date date) 
     { 
      return com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern).format(date); 
     } 

     public Date parse(String stringDate){ 
      return com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern).parseStrict(stringDate); 
     } 
    } 

    private static class DateTimeFormatServer extends DateTimeFormatClient 
    { 

     public DateTimeFormatServer(String pattern) 
     { 
      super(pattern); 
     } 


     @GwtIncompatible("Server format") 
     public String format(Date date) 
     { 
      return (new java.text.SimpleDateFormat(pattern)).format(date); 
     } 

     @GwtIncompatible("Server parse") 
     public Date parse(String dateString){ 
      try{ 
       return (new java.text.SimpleDateFormat(pattern)).parse(dateString); 
      }catch(Exception ex){ 
      throw new IllegalArgumentException("Cannot convert to date: "+ dateString); 
      } 
     } 

    } 
} 

Mam nadzieję, że to pomoże innym.

1
import com.google.gwt.i18n.shared.DateTimeFormat; 
DateTimeFormat fm = DateTimeFormat.getFormat("MM/dd"); 
String st = fm.format(date); 
+0

Bardzo zadbane rozwiązanie. – Vic

Powiązane problemy