2010-07-08 18 views
17

Potrzebuję uzyskać dane dnia, miesiąca, roku z wartości Date, ale getYear() jest przestarzałe, podaje rok na 2 cyfry i ma problemy z Y2K (2008 daje 108). Dokument java doc zaleca używanie java.util.calendar, ale nie jest obsługiwany w GWT.Uzyskaj szczegółowe informacje o dacie (dzień, miesiąc, rok) w GWT

Chcę uniknąć wysyłania wszystkich informacji w obie strony między serwerem a klientem, aby poradzić sobie z datami.

EDIT: Calendar być obsługiwanaData funkcje obsługi powinny być realizowane w GWT Futur wersjach: http://code.google.com/p/google-web-toolkit/issues/detail?id=603

Odpowiedz

19

Nie stosować te przestarzałe metody na Klasa daty w GWT.

Jeśli nie chcesz używać zewnętrznych implementacji dat dla GWT, używasz kombinacji DateTimeFormat wraz z manipulacją ciągami jako obejściem, dopóki GWT nie pojawi się z lepszą obsługą manipulowania datami.

For date - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[0] 

For month - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[1] 

For year - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[2] 

Edit- Podobnie unikać new Date (rr, mm, dd) doszła niespójności w zależności od przeglądarki i zakresu dat.

mam użyć prostego DateUtil Class do tworzenia i analizowania obiektów data w GWT, może przydać do Ciebie -

(Ostrzeżenie: Bardzo surowy, a prace w toku)

public class DateUtil 
{ 
    private static final String D_M_YYYY = "d-M-yyyy"; 
    private static final String DATE_SEPARATOR = "-"; 

    public static Date getDate(Integer dd, Integer mm, Integer yyyy) 
    { 
     if (dd == null || mm == null || yyyy == null) 
      return null; 

     Date retVal = null; 
     try 
     { 
      retVal = DateTimeFormat.getFormat(D_M_YYYY).parse(dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy); 
     } 
     catch (Exception e) 
     { 
      retVal = null; 
     } 

     return retVal; 
    } 

    public static String getDayAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[0]; 
    } 

    public static String getMonthAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[1]; 
    } 

    public static String getYearAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[2]; 
    } 

    public static boolean isValidDate(Integer dd, Integer mm, Integer yyyy) 
    { 
     boolean isvalidDate = true; 

     try 
     { 
      String transformedInput = DateTimeFormat.getFormat(D_M_YYYY).format(getDate(dd, mm, yyyy)); 
      String originalInput = dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy; 

      isvalidDate = transformedInput.equals(originalInput); 
     } 
     catch (Exception e) 
     { 
      isvalidDate = false; 
     } 

     return isvalidDate; 
    } 
} 
+0

Jakie implementacje dat strony trzeciej poleciłbyś? – Jla

+0

Nie mam złożonych arytmetyki terminów w mojej aplikacji, a tym samym nie poważnie wypatrywałem żadnej biblioteki DateTime dla GWT. Wiem, że istnieje narzędzie GwtDateTime (http://code.google.com/p/gwt-examples/wiki/gwtDateTime), ale nie przetestowałem go, nie mogę ręczyć za to. YMMV –

+0

Te nie działają w testach jednostkowych :((chyba że rozszerzysz GWTTestCase, która jest wolna) –

2

może po prostu dodać 1900 do getYear() wartości zwracanej

1

I nie myśl, że Gtt będzie obsługiwał Kalendarz w przyszłości, może być w stanie obsłużyć inną implementację manipulowania datą. Tak więc, ponieważ zalecenie java dotyczące nieużywania Data nie jest ważne w Gwt i nie masz żadnej innej opcji bez importowania biblioteki stron trzecich, właściwym sposobem jest użycie opcji Data i zignorowanie ostrzeżeń o wycofaniu.

+0

Istnieje kilka przypadków skrajnych, które zawiodły w przestarzałych pobierających Data. Zajęło mi to godziny, aby zlokalizować źródło błędu do metody getDate() na datę, s Następnie przestał używać metod Date.Zaleca się dokładne przetestowanie metod dat w oczekiwanym zakresie dat przed wdrożeniem do produkcji. –

24

Rozwiązania przedstawione przez Ashwina działają i nie jest to trudne. Ale proponuję użyć wzorców dat zamiast podziału:

For date - 
DateTimeFormat.getFormat("d").format(new Date()) 

For month - 
DateTimeFormat.getFormat("M").format(new Date()) 

For year - 
DateTimeFormat.getFormat("yyyy").format(new Date()) 
+1

Myślałem o tym samym pomyśle. Dlaczego dwa razy pracujesz? –

Powiązane problemy