2010-07-08 13 views
17

Necesito obtener los detalles de día, mes, año de un valor Date pero getYear() está en desuso, da año en 2 dígitos y tiene problemas con Y2K (2008 da 108) El documento java recomienda usar java.util.calendar pero no es compatible con GWT.Obtener detalles de la fecha (día, mes, año) en GWT

Quiero evitar enviar toda la información entre el servidor y el cliente solo para tratar las fechas.

Editar: Calendar esté disponible funciones de manejo Fecha deberían implementarse en GWT futur versiones: http://code.google.com/p/google-web-toolkit/issues/detail?id=603

Respuesta

19

No utilice los métodos obsoletos de Clase de fecha en GWT.

Si no desea utilizar implementaciones de fechas de terceros para GWT, por el momento usa una combinación de DateTimeFormat junto con la manipulación de cadenas como solución, hasta que GWT ofrezca un soporte mejor para manipular las fechas.

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] 

Editar- Del mismo modo, evitar el uso de nuevos Fecha inconsistencias (aa, mm, dd) ha venido dependiendo del rango del navegador y la fecha.

que tengo uso de un simple Clase DateUtil para crear y analizar los objetos Date en GWT, tal vez de alguna utilidad para usted -

(Advertencia: Muy crudo, y el trabajo en curso)

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

¿Qué implementaciones de fechas de terceros recomendaría? – Jla

+0

No tengo aritmética de fecha compleja en mi aplicación, y por lo tanto no he buscado seriamente ninguna biblioteca DateTime para GWT. Sé que hay una utilidad GwtDateTime (http://code.google.com/p/gwt-examples/wiki/gwtDateTime), pero al no haberlo probado, no puedo garantizarlo. YMMV –

+0

Estos no funcionan en pruebas unitarias :((a menos que extienda GWTTestCase, que es lento) –

2

Usted puede simplemente añadir 1900-getYear() valor de retorno

1

I No creo que gwt admita Calendar en el futuro, puede ser que sea compatible con otra implementación de manipulación de fechas. Por lo tanto, como la recomendación de java de no utilizar Fecha no es válida en Gwt y no tiene otra opción sin importar una biblioteca de terceros, la forma correcta es usar Fecha e ignorar las advertencias de desactivación.

+0

Hay algunos casos extremos que fallan en los usuarios obsoletos de Date. Me llevó horas encontrar la fuente del error a un método getDate() en la fecha, s Entonces, dejó de usar los métodos de fecha.Le recomendaría encarecidamente que pruebe los métodos de fecha a fondo para el intervalo de fechas esperado antes de implementar en producción. –

24

La solución presentada por Ashwin funciona y no es tan complicado. Pero sugeriría utilizar los patrones de fecha en lugar de dividir:

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

Estaba pensando lo mismo. ¿Por qué hacer el doble del trabajo? –

Cuestiones relacionadas