Java Fecha vs Calendario

Podría alguien por favor avise a la «mejor práctica» en torno a Date y Calendar tipos.

La hora de escribir código nuevo, es mejor siempre a favor de Calendar más de Date, o hay circunstancias donde Date es el más adecuado tipo de datos?

InformationsquelleAutor Marty Pitt | 2009-09-10

13 Kommentare

  1. 370

    Fecha es una sencilla clase y es principalmente por razones de compatibilidad con versiones anteriores. Si necesita establecer fechas específicas o hacer operaciones aritméticas de fecha, el uso de un Calendario. Los calendarios también se encargan de la localización. La fecha anterior a las funciones de manipulación de la Fecha ya han sido censurados.

    Personalmente tiendo a utilizar el tiempo en milisegundos como mucho (o Mucho, según corresponda), o cuando el Calendario no es una opción.

    Tanto la Fecha y el Calendario son mutables, que tiende a presentar problemas cuando se utilizan en una API.

    • FYI, el terriblemente molesto antiguo de la fecha y la hora de las clases, tales como java.util.Date, java.util.Calendar, y java.text.SimpleDateFormat ahora legado, suplantado por el de java.tiempo clases construido en Java 8 y versiones posteriores. Consulte Tutorial Oracle.
  2. 66

    La mejor manera para el nuevo código (si la política lo permite el código de terceros) es el uso de la Joda la biblioteca de Tiempo de.

    Tanto, Fecha y Calendario, tienen tantos problemas de diseño que ni son buenas soluciones para el nuevo código.

    • Apruebo la propuesta de utilizar la joda tiempo. Es más fácil de entender y de usar y ofrece muchas más funcionalidades que usted puede usar.
    • Para la discusión sobre si el uso de Joda Tiempo o un palo con el estándar de JDK clases, consulte stackoverflow.com/questions/589870/…
    • Cómo otros marcos de co-existe con eso? es apoyado fuera de la caja o necesitas escribir algunos convertidores adicionales?
    • No sé si merece downvotes, pero no responde a la pregunta. Podría ser mejor, como un comentario.
    • Porque la pregunta era sobre el uso de fechas de Calendario y no el uso de una biblioteca de terceros que agrega una sola dependencia de proveedores de riesgos para un proyecto.
    • FYI, el Joda-Time proyecto se encuentra ahora en modo de mantenimiento, asesorando a la migración a la de java.tiempo clases. Consulte Tutorial de Oracle.
    • Esta FUE la «mejor manera» hasta el java.paquete de tiempo de se puso a disposición con Java 8.

  3. 57
    • Date y Calendar son realmente el mismo concepto fundamental (ambos representan un instante en el tiempo y son contenedores de un subyacente long valor).

    • Uno podría argumentar que Calendar en realidad es aún más roto que Date es, como parece ofrecer datos concretos acerca de cosas como el día de la semana y la hora del día, mientras que si usted cambia su timeZone de la propiedad, el hormigón se convierte en blancmange! Ni objetos son realmente útiles como una tienda de año-mes-día o de la hora del día por esta razón.

    • Uso Calendar sólo como una calculadora que, cuando se administra Date y TimeZone objetos, hará los cálculos por usted. Evitar su uso para la propiedad de escribir en una aplicación.

    • Uso SimpleDateFormat junto con TimeZone y Date para generar Cadenas de pantalla.

    • Si te sientes aventurero uso Joda Tiempo, aunque es innecesariamente complicado en mi humilde opinión, y es que pronto será reemplazada por la JSR-310 fecha de la API en cualquier caso.

    • He contestado antes de que no es difícil de rodar sus propios YearMonthDay clase, que utiliza Calendar bajo el capó para los cálculos de fecha. Me fue votada abajo por la sugerencia pero creo que aún es válido porque Joda-El Tiempo (y JSR-310) son realmente complicados para la mayoría de los casos de uso.

    • Hay un marco de tiempo para JSR310 ? Iba a ser en Java 7, pero creo que ahora no es el caso.
    • ciertamente salido muy tranquilo en esa lista de correo!
    • Sólo la comprobación, se ha ido Inactivo, lo que significa que no he publicado un hito proyecto en 18 meses 🙁
    • Comentario más reciente en la lista de correo es de julio y Esteban, por lo que el proyecto es, probablemente, todavía, marcando
    • De acuerdo. Si usted sabe cómo usar la Fecha de forma segura como un objeto inmutable, y el Calendario para manipular Fechas, la mayoría de la gente debe ser seguro. Tenga cuidado al usar SimpleDateFormat en multiproceso código.
    • Me encanta el optimismo (a finales de 2009), detrás de la idea de que la Joda es «pronto para ser sustituida por la JSR-310 fecha de la API.»
    • JSR-310 ha sido publicado como parte de Java 8.

  4. 25

    Fecha es mejor para almacenar un objeto date. Es la persistió uno, Serializado uno …

    Calendario es el mejor para la manipulación de Fechas.

    Nota: a veces también a favor de java.lang.Largo tiempo de la Fecha, porque la Fecha es mutable y por lo tanto no es thread-safe. En una Fecha de objetos, uso de setTime() y getTime() para cambiar entre los dos. Por ejemplo, una constante en la Fecha en la aplicación (ejemplos: el cero 1970/01/01, o un aplicativo END_OF_TIME que se establecen para 2099/12/31 ; los que son muy útiles para reemplazar los valores null como hora de inicio y hora de finalización, especialmente cuando persisten en la base de datos, como SQL es tan peculiar con valores nulos).

    • Yo lo tome usted está tomando sobre la inmutable java.lang.Long
  5. 17

    Yo generalmente uso la Fecha si es posible. Aunque es mutable, los modificadores son realmente obsoleto. Al final, básicamente, se ajusta un tiempo que representaría la fecha/hora. Por el contrario, me gustaría utilizar Calendarios si tengo que manipular los valores.

    Usted puede pensar de esta manera: usted sólo uso StringBuffer sólo cuando se necesitan Cadenas que se puede manipular fácilmente y, a continuación, convertirlos en Cadenas utilizando el método toString (). De la misma manera, yo sólo uso el Calendario, si me necesitas para manipular los datos temporales.

    Para las mejores prácticas, que tienden a usar los objetos inmutables tanto como sea posible fuera de la modelo de dominio. Esto reduce significativamente las posibilidades de efectos secundarios y es hecho para usted por el compilador, en lugar de una prueba de JUnit. Se utiliza esta técnica mediante la creación de final privado campos en su clase.

    Y volviendo al StringBuffer analogía. En el código siguiente se muestra cómo convertir entre Calendario y la Fecha

    String s = "someString"; //immutable string
    StringBuffer buf = new StringBuffer(s); //mutable "string" via StringBuffer
    buf.append("x");
    assertEquals("someStringx", buf.toString()); //convert to immutable String
    
    //immutable date with hard coded format.  If you are hard
    //coding the format, best practice is to hard code the locale
    //of the format string, otherwise people in some parts of Europe
    //are going to be mad at you.
    Date date =     new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2001-01-02");
    
    //Convert Date to a Calendar
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    
    //mutate the value
    cal.add(Calendar.YEAR, 1);
    
    //convert back to Date
    Date newDate = cal.getTime();
    
    //
    assertEquals(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2002-01-02"), newDate);
    • Sí, objetos inmutables sentido para la fecha y la hora de trabajo. El java.tiempo clases que suplantado Date/Calendar el uso de los objetos inmutables patrón.
    • Eso puede ser cierto, pero no en 2010.
    • Sí. Pero hay miles de personas que leen esta página ahora, más de 150.000 hasta ahora. Mi comentario es una nota para ellos, no una crítica.
    • Yo sé, por eso me upvoted la otra respuesta. Sin embargo, todavía hay algunas personas que necesitan sufrir con los mayores JDKs que necesita la respuesta de arriba también.
    • En realidad, para Java 6 & 7, tenemos el ThreeTen-Backport proyecto. Esto trae la mayor parte de la java.tiempo funcionalidad con prácticamente la misma API. Así que no hay necesidad de utilizar jamás aquellos terrible legado de la fecha y la hora de clases.
  6. 15

    Dates debe ser usada como inmutable puntos en el tiempo; Calendars son mutables, y puede pasar de todo y modificados si la necesidad de colaborar con otras clases para venir para arriba con una fecha final. Considerar análoga a String y StringBuilder y vas a entender cómo considero que debe ser utilizado.

    (Y sí, sé que la Fecha no es en realidad técnicamente inmutable, pero la intención es que no debe ser mutable, y si no llama a los obsoletos métodos a continuación, no es así.)

    • Sí, objetos inmutables sentido para la fecha y la hora de trabajo. El java.tiempo clases que suplantado Date/Calendar el uso de los objetos inmutables patrón. Específicamente, Instant reemplaza java.util.Date, y ZonedDateTime reemplaza Calendar/GregorianCalendar.
  7. 12

    tl;dr

    asesorar a la actual «mejores prácticas» en torno a Date y Calendar

    es mejor siempre a favor de Calendar más de Date

    Evitar estas clases antiguas completamente. Uso java.tiempo clases en su lugar.

    • Por un momento en UTC, uso Instant
      (el equivalente moderno de Date)
    • Por un momento en un determinado la zona horaria, uso ZonedDateTime
      (el equivalente moderno de GregorianCalendar)
    • Por un momento en un determinado desplazamiento de UTC, uso OffsetDateTime
      (sin equivalente en el legado de clases)
    • Para una fecha y hora (no de momento) con el desconocido de la zona horaria o el desplazamiento, uso LocalDateTime
      (sin equivalente en el legado de clases)

    Detalles

    La Respuesta por Ortomala Lokni es derecho de sugerir el uso de la moderna java.tiempo clases en lugar de la problemática antiguo legado de la fecha y la hora de clases (Date, Calendar, etc.). Pero esa Respuesta sugiere la clase equivocada como equivalentes (ver mi comentario en la Respuesta).

    Usando java.tiempo

    El java.el tiempo de clases son una gran mejora sobre el legado de fecha y hora de las clases, de noche y de día de diferencia. La edad, las clases están mal diseñados, confuso y molesto. Usted debe evitar la edad, las clases siempre que sea posible. Pero cuando usted necesita para convertir a/desde el viejo/nuevo, puede hacerlo llamando a los nuevos métodos de agregar a la de edad clases.

    Para obtener más información sobre la conversión, a ver mi Respuesta y símbolos de diagrama de a otra Pregunta, Convertir java.util.La fecha para qué «de java.el tiempo de» tipo?.

    La búsqueda de Desbordamiento de Pila da muchos cientos de ejemplo de Preguntas y Respuestas sobre el uso de java.tiempo. Pero aquí es una breve sinopsis.

    Instant

    Obtener en el momento actual con un Instant. El Instant clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

    Instant instant = Instant.now();

    ZonedDateTime

    A ver que mismo simultánea momento a través de la lente de alguna región particular del hora del reloj de pared, aplique una zona horaria (ZoneId) para obtener una ZonedDateTime.

    Zona horaria

    Especificar un en el tiempo apropiado, el nombre de la zona en el formato de continent/region, tales como America/Montreal, Africa/Casablanca, o Pacific/Auckland. No utilice nunca el 3-4 letra de la abreviatura como EST o IST como son no verdadero zonas de tiempo, no estandarizado, y ni siquiera único(!).

    ZoneId z = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = instant.atZone();

    Desplazamiento

    Una zona horaria es una historia de la región de los cambios en su desplazamiento de UTC. Pero a veces se le da sólo un desplazamiento sin la plena zona. En ese caso, utilice el OffsetDateTime clase.

    ZoneOffset offset = ZoneOffset.parse( "+05:30" );
    OffsetDateTime odt = instant.atOffset( offset );

    Uso de una zona horaria es preferible el uso de un mero desplazamiento.

    LocalDateTime

    El «Local» en el Local… clases significa que cualquier localidad, no una localidad en particular. Por lo que el nombre puede ser contra-intuitivo.

    LocalDateTime, LocalDate, y LocalTime a propósito de la falta de cualquier información acerca de desplazamiento o la zona horaria. Así que hacen no representa la actual momentos, son no puntos en la línea de tiempo. En caso de duda o confusión, uso ZonedDateTime en lugar de LocalDateTime. Búsqueda de Desbordamiento de Pila para mucho más discusión.

    Cadenas

    No se identificara la fecha y la hora de objetos con cadenas que representan su valor. Se puede analizar una cadena para obtener una fecha y hora de objeto, y se puede generar una cadena de fecha y hora de objeto. Pero la cadena no es nunca la fecha-tiempo.

    Aprender acerca de estándar ISO 8601 formatos, que se utiliza por defecto en java.clases de tiempo.


    Sobre java.tiempo

    La java.tiempo marco está construido en Java 8 y versiones posteriores. Estas clases suplantar la problemática de edad legado fecha y hora de las clases, tales como java.util.Fecha, Calendario, & SimpleDateFormat.

    La Joda-Time proyecto, ahora en el modo de mantenimiento, asesora de la migración a la java.tiempo clases.

    Para obtener más información, consulte la Oracle Tutorial. Y la búsqueda de Desbordamiento de Pila, hay muchos ejemplos y explicaciones. La especificación es JSR 310.

    El uso de un Controlador JDBC compatible con JDBC 4.2 o más tarde, usted puede intercambiar java.tiempo objetos directamente con la base de datos. Sin necesidad de cuerdas ni de java.sql.* clases.

    Dónde obtener el java.clases de tiempo?

    • Java SE 8, Java SE 9, y más tarde
      • Incorporado.
      • Parte de la norma API de Java con un paquete de implementación.
      • Java 9 añade algunas características menores y correcciones.
    • Java SE 6 y Java SE 7
      • Mucho de java.el tiempo es la funcionalidad de back-portado a Java 6 & 7 en ThreeTen-Backport.
    • Android
      • Versiones posteriores de Android paquete de implementaciones de java.clases de tiempo.
      • Para versiones anteriores de Android, la ThreeTenABP proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo utilizar ThreeTenABP….

    La ThreeTen-Extra proyecto se extiende java.tiempo con clases adicionales. Este proyecto es un terreno de prueba para posibles futuras incorporaciones a java.tiempo. Usted puede encontrar algunos de clases útiles aquí como Intervalo, YearWeek, YearQuarter, y más.

  8. 10

    Con Java 8, la nueva java.paquete de tiempo debe ser utilizado.

    Objetos son inmutables, las zonas de tiempo y ahorro de luz del día se toman en cuenta.

    Puede crear un ZonedDateTime objeto de un viejo java.util.Fecha objeto como este:

        Date date = new Date();
        ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());
  9. 9

    Siempre me defensor Joda-el tiempo. He aquí por qué.

    1. la API es consistente e intuitiva. A diferencia de la de java.util.Fecha/Calendario De La Api De
    2. no sufren de problemas de subprocesamiento, a diferencia de java.texto.SimpleDateFormat etc. (He visto los numerosos problemas del cliente relativas a no darse cuenta de que el estándar de formato de fecha y hora no es thread-safe)
    3. es la base de la nueva Java fecha/hora Api (JSR310, programada para Java 8. Así que usted va a ser el uso de Api que se convierten en núcleo de APIs de Java.

    EDICIÓN: Java fecha/hora clases introducido con Java 8, ahora son la solución preferida, si puede migrar a Java 8

    • La última vez que miré, JODA y JSR-310 miró es diferentes, incluso si son escritas por Stephen Colebourne. Dicho esto, JODA introduciría a la complejidad de la fecha y la hora de los problemas que JSR-310 también soluciona
    • Votada abajo ¿por qué ?
    • Porque la pregunta era sobre el uso de fechas de Calendario y no el uso de una biblioteca de terceros que agrega una sola dependencia de proveedores de riesgos para un proyecto.
    • Puedo mantener la mejor práctica es simplemente no usar esas clases
    • Dado que se conoce de los problemas con el java.util.Fecha y Calendario de clases, lo que sugiere Joda-Time (o JSR 310) parece adecuada y responsable a mí. No estamos hablando de una cuestión de gusto o estilo estético. Si a alguien le preguntó si debían tomar el coche rojo o la plata del coche, y yo sabía que el coche rojo tenía una rueda pinchada y la plata coche se había roto un radiador, debo coger un coche o debo sugerimos llamar un taxi? La respuesta a esa pregunta debería parecer obvio hoy en día, ya que incluso en Sun/Oracle decidió dejar atrás los junkers y comprar un coche nuevo: JSR 310: Fecha y Hora de la API.
    • Actualización de la respuesta: JSR 310 es parte de Java 8, en la java.tiempo.* clases.
    • FYI, el Joda-Time proyecto se encuentra ahora en modo de mantenimiento, asesorando a la migración a la de java.tiempo clases. Consulte Tutorial de Oracle.
    • De acuerdo. Estoy modifica la respuesta apropiada

  10. 8

    Un poco tarde a la fiesta, pero Java tiene una nueva Fecha de la API de Tiempo en el JDK 8. Puede que desee actualizar su JDK versión y abrazar la norma. No más desordenado de fecha/calendario, no más de 3 ª parte de los frascos.

  11. 1

    La fecha debe ser re-desarrollado. En lugar de ser un largo interger, se debe mantener año, mes, fecha, hora, minuto, segundo, como campos independientes. Podría ser incluso bueno para almacenar el calendario y la zona horaria de esta fecha se asocia con el.

    En nuestra conversación natural, si el programa de instalación una cita en Noviembre. 1, 2013 1pm NY el Tiempo, este es un DateTime. NO es un Calendario. Por lo que debe ser capaz de conversar como este en Java así.

    Cuando la Fecha se almacena como un entero largo (de mili segundos desde el 1 de enero de 1970, o algo), el cálculo de su fecha actual depende del calendario. Diferentes calendarios dará otra fecha. Esto es desde la perspectiva de dar un tiempo absoluto (por ejemplo, 1 billón de segundos después del Big Bang). Pero a menudo también necesitamos una manera conveniente de la conversación, como un objeto de encapsular el año, mes, etc.

    Me pregunto si hay nuevos avances en Java para conciliar estos 2 objetivos. Tal vez mis conocimientos de java es demasiado viejo.

    • El hecho de que se puede almacenar en el mismo instante en el tiempo, pero el informe diferente de la hora/minuto/día/semana/año/foo basados en diferentes sistemas de calendario, es una fortaleza, no una debilidad. Refleja el (complejo) de la realidad.
    • De hecho, Date ha sido re-elaborado, sustituido por el java.time.Instant clase. Y Calendar/GregorianCalendar fue reemplazado por java.time.ZonedDateTime clase.
  12. 0

    Por cierto, «fecha» es generalmente etiquetados como «obsoleto o en desuso» (no sé exactamente por qué) – algo se escribió allí
    Java: ¿por Qué es el constructor de Fecha obsoleto, y lo puedo usar en su lugar?

    Parece que es un problema del constructor única forma – a través de nueva Fecha(int año, int mes, int dia), forma recomendada es a través del Calendario y set de parámetros por separado .. (Calendario cal = Calendario.getInstance();
    )

  13. 0

    Me Calendario de uso cuando necesito algunas operaciones específicas sobre las fechas como el movimiento en el tiempo, pero la Fecha me parece útil cuando usted necesita el formato de la fecha para adaptarse a sus necesidades, recientemente he descubierto que la configuración Regional tiene una gran cantidad de útiles de las operaciones y métodos.Así que estoy usando la configuración Regional por ahora!!!

    • FYI, la problemática Calendar & Date clases fueron suplantados años por el java.tiempo clases. No hay necesidad de utilizar jamás Date o Calendar. Y Locale no tiene nada que ver con los significados de la fecha y la hora de los objetos. Un Locale sólo se utiliza para especificar el lenguaje de los humanos y de las normas culturales para ser utilizado en la localización, mientras que la generación de texto para representar el valor de una fecha-hora de objeto.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea