2012-04-23 16 views
15

Ho una funzione che deve funzionare allo stesso modo su client e server e che formatta le date.GWT: utilizzare DateTimeFormat sul client e SimpleDateFormat sul server

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

GWT si lamenta: Nessun codice sorgente è disponibile per il tipo SimpleDateFormat. L'errore non è fatale (almeno in modalità dev), ma fastidioso e non c'è modo di sopprimerlo. Trovato una domanda simile su http://groups.google.com/group/google-web-toolkit/browse_thread/thread/981247fca161c287. Ci suggeriscono:

è possibile fornire un'implementazione supersource fittizio di SimpleDateTimeFormat in modo che fosse la compilazione.

Ho provato. Ora Eclipse si lamenta:

java.text Il pacchetto "java.text" ha dichiarato non corrisponde al pacchetto "foo.jre.java.text" previsto SimpleDateFormat.java

risposta

0

Dovete dire Eclipse non compila il tuo file Java super-source. Se stai usando Maven, è semplicemente questione di spostarlo su src/main/resources; altrimenti, escludi il pacchetto "jre" dal percorso di generazione di Eclipse.

... detto questo, preferirei la super-sorgente della classe che utilizza SimpleDateFormat/DateTimeFormat, e/o spostarlo in una classe helper che verrebbe super-source.

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

Questo bisogno @GwtIncompatible da http://code.google.com/p/google-web-toolkit/source/detail?r=11570 è lo stato rilasciato? – fgb

+1

questo è ora rilasciato in GWT 2.6 (ma hai ragione, non era in 2.5.1 o precedente) –

+1

Non funziona in GWT 2.7: 'Il metodo getFormat (String) non è definito per il tipo DateTimeFormat.DateTimeFormatServer' – stepancheg

27

È possibile utilizzare com.google.gwt.i18n.shared.DateTimeFormat su entrambi i server e client:

chiamare il costruttore protetto per evitare GWT.create

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

Esempio

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

Il trucco è fatto da estensione del DateTimeFormat in modo che possiamo utilizzare il costruttore protetto con DateTimeFormatInfo dove si usa il new DefaultDateTimeFormatInfo() per evitare di chiamare di GWT.create

1

Questa soluzione è un po 'diverso, ma nello stesso percorso di quello @ochakov presentato ma risolve il problema GWT 2.7 @stepancheg e che ho citato.

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

    } 
} 

Spero che questo aiuti gli altri.

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

Soluzione molto pulita. – Vic

Problemi correlati