¿Cómo puedo obtener una cita sin hora en Java?

Continua de Desbordamiento de Pila pregunta Programa de Java para obtener la fecha actual sin marca de tiempo:

¿Cuál es la forma más eficiente para obtener un objeto Date, sin el tiempo? No hay una forma mejor de estos dos?

//Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));

//Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();

Actualización:

  1. Sabía acerca de Joda-El Tiempo; sólo estoy tratando de evitar adicionales de la biblioteca para un sencillo (creo) de la tarea. Pero a partir de las respuestas hasta ahora Joda-el Tiempo parece extremadamente popular, por lo que yo podría considerar.

  2. Por eficiente, me refiero a que quiero evitar objeto temporal String creación como el usado por method 1, mientras tanto method 2 parece un hack en lugar de una solución.

  • Eficiente? ¿Necesitas más eficiencia de lo que es proporcionado por ejemplo, por method1?
  • ¿Qué entiende usted por «eficiente»? Una fecha es básicamente un tipo de tiempo, realmente no se puede hacer esto en menos memoria de la que. Si te refieres a «conveniente», JODA tiempo es el camino a seguir.
  • +1 Exactamente la pregunta que yo tenía.
  • Me gusta el método 2. Crear un método estático de una clase de utilidad y acaba de usar. He estado este enfoque durante años.
  • Método 2 no es que a corto. Usted también tiene que coger el de java.texto.ParseException o tirarlo a la basura.
  • Una molestia en su «update 1»: si era «tan sencilla», supongo que el Sol no habría llegado a tal horrendo e ineficiente de la API, y usted (y un montón de otras personas) no estaría haciendo esa pregunta a todos 😉
  • ¿Por qué importa que no es «corto»? Cada línea es eficiente. Estoy seguro de que es mucho más rápido que el método 1, lo que implica el formato y análisis.
  • No hay tal cosa como una fecha sin tiempo. En el mejor de la fecha es un periodo de 24 horas limitada («a la medianoche en algunos de la zona horaria»).
  • FYI, la problemática de edad de fecha y hora de las clases, tales como java.util.Date, java.util.Calendar, y java.text.SimpleDateFormat ahora están legado, suplantado por el java.tiempo clases. Mucho de java.el tiempo es la funcionalidad de back-portado a Java 6 & Java 7 en el ThreeTen-Backport proyecto. Adaptado para versiones anteriores de Android en el ThreeTenABP proyecto. Consulte Cómo utilizar ThreeTenABP….

InformationsquelleAutor Rosdi Kasim | 2011-02-19

22 Kommentare

  1. 108

    Hacer absolutamente han utilizar java.util.Date? Me gustaría fondo recomendamos que utilice Joda Tiempo o la java.time paquete de Java 8 en su lugar. En particular, mientras que la Fecha y el Calendario siempre representar un determinado instante en el tiempo, sin que el concepto como «solo un día», Joda Tiempo hace tener un tipo que representa a este (LocalDate). Su código será mucho más claro si usted es capaz de utilizar los tipos que representan lo que en realidad estamos tratando de hacer.

    Hay muchas, muchas otras razones para el uso de Joda Tiempo o java.time en lugar de la incorporada en el java.util tipos son generalmente mucho mejor Api. Siempre se puede convertir a/desde un java.util.Date en los límites de su propio código, si usted necesita, por ejemplo, para la interacción de base de datos.

    • En las aplicaciones de la empresa no siempre tenemos la opción de agregar o utilizar otras librerías. Agradezco el puntero a la Joda Tiempo, pero realmente no es una respuesta para el problema original de llegar a la parte de fecha utilizando el estándar de Java. Gracias. Upvoting Chathuranga la respuesta.
    • Chathugranga la respuesta no contesta a la pregunta original, que está preguntando acerca de cómo obtener una Date objeto de que la respuesta formatos de una fecha a una cadena, que no es lo mismo. Fundamentalmente, preguntando qué fecha Date es una pregunta sin sentido, sin más información: el tiempo de la zona y el sistema de calendario que está utilizando.
    • «En las aplicaciones de la empresa no siempre tenemos la opción de agregar o utilizar otras bibliotecas». De verdad ? Se sugiere que usted no puede usar la 3ª parte de libs en todo ?
    • noogrub comentario parece estar relacionado con la no-tech limitaciones, creo
    • Desde la perspectiva actual: «Joda-Time es el estándar de facto en la fecha y hora de la biblioteca de Java antes de Java SE 8. Los usuarios ahora se les pide a migrar a java.tiempo (JSR-310).»
    • Esta respuesta es de varios años – Una mejor y más actual de la respuesta de la Albahaca a continuación. También – otro usuario con limitaciones en la 3ra parte empaquetadas como Joda Tiempo. De algunos (pero no todos) de mis clientes, el uso de algo como Joda es DOA. ACEPTAR a los mencionados paquetes así que para las personas que pueden utilizar, pero más allá de esta respuesta en SE), las personas deben ser conscientes de que no siempre es una opción.
    • Debemos dar crédito al autor original de Joda tiempo que fue contratado por Oracle para «esencialmente» migrar Joda tiempo para Java 8. Leer más aquí oracle.com/technetwork/articles/java/…
    • No puede ver cómo este responde a la OP de la pregunta. Él le pregunta acerca de la Fecha de la biblioteca nativa, esto sugiere el uso de otro tipo de biblioteca. La OP del problema no tiene solución con eso.
    • Sí, no hay solución con Date porque Date representa un instante de tiempo, no es una fecha (a pesar de su nombre). La respuesta de los estados que no existe tal concepto como «una fecha» en la Fecha y Calendario. Luego se sugiere el uso de una alternativa API.
    • he utilizado LocalDate en mi jpa repositorio para obtener y establecer la fecha sólo con poco tiempo, pero cuando se analiza la tabla mysql mostrando su tiempo también y el tipo de datos de campo de fecha es de tipo datetime ¿por qué no ahora? Alguna sugerencia de cómo hacerlo
    • Te sugiero hacer una nueva pregunta con todos los detalles.

  2. 63

    Aquí es lo que he usado hasta la fecha de hoy con el tiempo establecido para 00:00:00:

    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    
    Date today = new Date();
    
    Date todayWithZeroTime = formatter.parse(formatter.format(today));
    • ¿De qué manera es esto diferente de la que ya propuso el «método 1» en la pregunta original?
    • No se ocupa de lo de la zona horaria esto ocurre en (de izquierda a la zona horaria por defecto de la JVM).
  3. 56

    Puede utilizar el DateUtils.truncate de Apache Commons biblioteca.

    Ejemplo:

    DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)
    • Si vas a añadir una nueva biblioteca, que se Joda en lugar de Apache Commons.
    • +1 @Dibbeke La diferencia no es sólo que sería la adición de una biblioteca en lugar de otro. A veces uno no quiere aprender toda una nueva biblioteca para la tarea trivial de truncar el tiempo a partir de una fecha. O no quiere tener código que mezcla la Fecha / Calendario con Joda fechas usando a veces el primero y a veces el segundo. O no puede permitirse el lujo de / justificar el reemplazo de todos los que trabajan Fecha / Calendario basado en código con otra biblioteca para tal trivial propósito. Y se sugiere que se Joda es ciertamente buena, ya que es claramente superior y simplemente lo Correcto, a veces la vida real de patadas en el.
    • Genio! Me ha ayudado mucho
  4. 35

    No hay una forma mejor de estos dos?

    Sí, los hay.

    LocalDate.now( 
        ZoneId.of( "Pacific/Auckland" ) 
    )

    java.tiempo

    Java 8 y más tarde viene con la nueva java.paquete de tiempo incorporado. Ver Tutorial. Mucho de java.el tiempo es la funcionalidad de back-portado a Java 6 & 7 en ThreeTen-Backport y adaptado a Android en ThreeTenABP.

    Similar a Joda-El Tiempo, java.tiempo ofrece un LocalDate clase para representar una fecha valor solo sin la hora del día y sin zona horaria.

    Nota que de la zona horaria es fundamental para la determinación de una fecha determinada. Al filo de la medianoche en París, por ejemplo, la fecha todavía es «ayer» en la ciudad de Montreal.

    LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;

    Por defecto, java.tiempo utiliza el ISO 8601 estándar en la generación de una cadena con la representación de una fecha o de fecha y hora valor. (Otra similitud con la Joda de Tiempo.) Así que simplemente llame toString() para generar texto como 2015-05-21.

    String output = today.toString() ; 

    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.

    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.

    • Gracias por mencionar la zona horaria. No se le había ocurrido a mí que «¿qué día es» no es un concepto absoluto.
    • Obtener la fecha siempre involucra a una zona horaria. Pero el truco es que si no especificar una zona horaria, su JVM actual de la zona horaria predeterminada se aplica automáticamente en la determinación de la fecha. En la parte superior de que, de la JVM actual zona horaria predeterminada puede cambiar en cualquier momento! Cualquier código en cualquier hilo de cualquier aplicación dentro de la JVM puede llamar TimeZone.setDefault durante el tiempo de ejecución y afectar inmediatamente a todos los demás de código que se ejecuta en la JVM. Moraleja de la Historia: Siempre especificar una zona horaria.
  5. 22

    La forma más sencilla:

    long millisInDay = 60 * 60 * 24 * 1000;
    long currentTime = new Date().getTime();
    long dateOnly = (currentTime / millisInDay) * millisInDay;
    Date clearDate = new Date(dateOnly);
    • Para mí, esto es en la actualidad: «Sat Feb 19 01:00:00 CET 2011″. Si usted desea usar, luego sólo con la hora UTC.
    • No es la línea 3 long dateOnly = (currentTime / millisInDay) * millisInDay; la misma como la escritura de long dateOnly = currentTime; ?
    • No, porque de operaciones con números enteros. Piense en esto como las Matemáticas.piso(currentTime / millisInDay) * millisInDay. Él es, efectivamente, el ajuste de la hora 00:00:00 de ese modo.
    • Esta solución es probablemente muy bien para la mayoría de aplicaciones, pero se advierte que la suposición de que un día ha 60 * 60 * 24 * 1000 no es siempre cierto. Usted puede, por ejemplo, de segundos intercalares en algunos días.
    • Considera que este sencillo y transparente?
    • Este es sin duda el más obtuso y no se recomienda de manera más otro 1 y 2 de la línea clara y concisa de los métodos.

  6. 21

    El estándar de la respuesta a estas preguntas es el uso de Joda Tiempo. El API es mejor y si estás usando el formateadores y analizadores puede evitar la no-intuitivo falta de seguridad en los hilos de SimpleDateFormat.

    El uso de Joda significa que usted puede simplemente hacer:

    LocalDate d = new LocalDate();

    De actualización:: el Uso de java 8 esto puede ser logrado mediante

    LocalDate date = LocalDate.now();
    • El nuevo java.paquete de tiempo en Java 8 también ofrece un LocalDate clase similar a la Joda-Time.
    • Lo ideal sería pasar un DateTimeZone para que LocalDate constructor. La determinación de la fecha actual depende de la zona horaria, como París, comienza una nueva fecha anterior a la de Montreal. Si se omite el tiempo de la zona, su JVM zona horaria predeterminada se aplica. General, es mejor especificar que dependen de forma predeterminada.
  7. 8

    Esta es una forma sencilla de hacerlo:

    Calendar cal = Calendar.getInstance();
    SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
    System.out.println(dateOnly.format(cal.getTime()));
    • Esta respuesta llega a abordar la cuestión. La obtención de una cadena con un formato no era el objetivo.
  8. 7

    No tiene sentido hablar de una fecha sin una marca de tiempo con respecto a la Fecha de rutinas en el estándar de java en tiempo de ejecución, ya que, esencialmente, los mapas de abajo específica de una milésima de segundo, y no la fecha. Dijo milisegundo intrínsecamente tiene una hora del día adjunto, lo que hace vulnerables a la zona horaria de problemas como Horario de verano y otros ajustes de calendario. Ver ¿Por qué es la resta de estos dos tiempos (en 1927), dando un resultado extraño? para un ejemplo interesante.

    Si quieres trabajar con fechas en lugar de milisegundos, usted necesita usar algo más. Para Java 8 no es un nuevo conjunto de métodos de proporcionar exactamente lo que usted pide. Para Java 7 y anteriores utilizan http://www.joda.org/joda-time/

    • Nota: Los enfoques diciendo: «la fecha a medianoche» no controla el horario de verano y múltiples zonas horarias bien.
    • Lo confirmo, yo era el incremento de las fechas por un día en mi aplicación, y aprendió acerca de esto con un informe de error a los usuarios en una zona horaria con horario de verano (mi país no utiliza el horario de verano). En el día de horario de verano comienza mi app añade 11 horas en lugar de 12. Tal vez el uso de mediodía como a la hora de un «no tiempo» la fecha es mejor?
    • Es todavía un hack. Usted puede encontrar youtube.com/watch?v=-5wpm-gesOY entretenido.
    • Thorbjorn, tienes razón, sólo quería evitar JodaTime debido a la adición de una biblioteca para una sola característica de sonido excesivo para mí. Yo sabía acerca de ese video, gracioso, de hecho.
    • Fe de erratas de mi primer comentario: mi app agregó 23 horas en lugar de 24
    • el manejo del tiempo es uno de los casos donde la adición de una biblioteca para obtener el derecho es una muy buena idea. Y su «agregar las 24 horas del mediodía en repetidas ocasiones» fallaría en el caso de que en el video en el que se saltó un día para llegar al otro lado de la línea de cambio de fecha.
    • Ok, pero no creo que un «muy nervioso-caso» para el manejo del tiempo? ¿Cuál es la frecuencia de que ocurra el cambio? También, me pregunto cómo JodaTime asas que en caso de límite
    • El punto fue que hay una vida real de casos de uso que en el que su enfoque sería considerado un error. Si usted encuentra uno, no podría ser más… no sé cómo Joda se encarga de esto, pero usted puede tener una mirada. También tenga en cuenta que Java 8 trae una nueva fecha de la biblioteca de tiempo (basado en las experiencias con la Joda) que usted puede desear mirar en.

  9. 4

    Definitivamente no es la manera más correcta, pero si sólo necesita una solución rápida para obtener la fecha sin la hora y usted no desea utilizar una biblioteca de terceros esto debe hacer

        Date db = db.substring(0, 10) + db.substring(23,28);

    Sólo necesitaba la fecha para visual a los efectos y no podía Joda así que me substringed.

  10. 4
    //09/28/2015
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));
    
    //Mon Sep 28
    System.out.println( new Date().toString().substring(0, 10) );
    
    //2015-09-28
    System.out.println(new java.sql.Date(System.currentTimeMillis()));
    
    //2015-09-28
    //java 8
    System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); //rest zones id in ZoneId class
  11. 3

    Bien, que yo sepa no hay manera más fácil de lograr esto si sólo vas a usar el estándar de JDK.

    Usted puede, por supuesto, puesto que la lógica en method2 en una función estática en una clase auxiliar, como el hecho aquí en el toBeginningOfTheDay-método

    A continuación, puede acortar el segundo método:

    Calendar cal = Calendar.getInstance();
    Calendars.toBeginningOfTheDay(cal);
    dateWithoutTime = cal.getTime();

    O, si usted realmente necesita el día actual en este formato tan a menudo, entonces usted puede envolver en otro método auxiliar estática, lo que hace que sea un one-liner.

  12. 3

    Si lo que quieres es ver la fecha como «AAAA-MM-DD» sin todos los otros desorden por ejemplo, «Jueves 21 de Mayo a las 12:08:18 EDT 2015» entonces utilice java.sql.Date. En este ejemplo se obtiene la fecha actual:

    new java.sql.Date(System.currentTimeMillis());

    También java.sql.Date es una subclase de java.util.Date.

  13. 3

    Si sólo necesita la fecha actual, sin tiempo, otra opción es:

    DateTime.now().withTimeAtStartOfDay()
    • La Pregunta para ninguna hora del día. El resultado es una fecha-hora de objeto que tiene de hecho una de la hora del día, que el tiempo se 00:00:00 generalmente (puede variar por la zona de tiempo de anomalías, por ejemplo, DST). Así que, como otras Respuestas nota, el LocalDate clase es la más apropiada, de Joda-Time (suponiendo que se hace referencia Joda-el Tiempo – lo que usted debe señalar explícitamente al citar las clases que no venían con Java).
  14. 3

    Uso LocalDate.now() y convertir en Date como la siguiente:

    Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
    • La JVM actual de la zona horaria predeterminada puede cambiar en cualquier momento durante el tiempo de ejecución. Cualquier código en cualquier hilo de cualquier aplicación dentro de la JVM puede llamar TimeZone.setDefault. Su código está llamando ZoneId.systemDefault dos veces, la primera está implícita en LocalDate.now() y la segunda es explícito con atStartOfDay. Entre esos dos momentos en el tiempo de ejecución, el valor predeterminado actual de la zona podría cambiar. Sugiero la captura de la zona en una variable, y pasar a ambos métodos.
  15. 2

    Si usted necesita la parte de la fecha sólo para hacerse eco propósito, entonces

    Date d = new Date(); 
    String dateWithoutTime = d.toString().substring(0, 10);
    • Yo no creo que esto es i18n amable
  16. 1

    El más directo camino que hace un uso completo de la enorme zona Horaria de la Base de datos de Java y es correcta:

    long currentTime = new Date().getTime();
    long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);
  17. 1

    Aquí es una solución limpia con ninguna conversión a string y espalda, y también que no vuelva a calcular el tiempo varias veces a medida que se restablece cada componente del tiempo a cero. También utiliza % (módulo) en lugar de dividir, seguido por multiplicar para evitar la doble operación.

    No requiere de la tercera parte de las dependencias, y se RESPETA LA zona HORARIA DEL Calendario objeto pasado. Esta función devuelve el momento en el tiempo, a las 12 AM en la zona horaria de la fecha (Calendario) se pasen.

    public static Calendar date_only(Calendar datetime) {
        final long LENGTH_OF_DAY = 24*60*60*1000;
        long millis = datetime.getTimeInMillis();
        long offset = datetime.getTimeZone().getOffset(millis);
        millis = millis - ((millis + offset) % LENGTH_OF_DAY);
        datetime.setTimeInMillis(millis);
        return datetime;
    }
    • No estoy muy convencido de que va a respetar el verano de tme (DST)?
  18. 1

    Lo que acerca de esto?

    public static Date formatStrictDate(int year, int month, int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, dayOfMonth, 0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }
  19. 0

    Prefiere no usar librerías de terceros tanto como sea posible. Sé que de esta manera se menciona antes, pero aquí es un bonito y limpio manera:

      /*
        Return values:
        -1:    Date1 < Date2
         0:    Date1 == Date2
         1:    Date1 > Date2
    
        -2:    Error
    */
    public int compareDates(Date date1, Date date2)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
    
        try
        {
            date1 = sdf.parse(sdf.format(date1));
            date2 = sdf.parse(sdf.format(date2));
        }
        catch (ParseException e) {
            e.printStackTrace();
            return -2;
        }
    
        Calendar cal1 = new GregorianCalendar();
        Calendar cal2 = new GregorianCalendar();
    
        cal1.setTime(date1);
        cal2.setTime(date2);
    
        if(cal1.equals(cal2))
        {
            return 0;
        }
        else if(cal1.after(cal2))
        {
            return 1;
        }
        else if(cal1.before(cal2))
        {
            return -1;
        }
    
        return -2;
    }

    Bien, el no uso de GregorianCalendar es tal vez una opción!

  20. 0

    Acabo de hacer esto para mi app :

    public static Date getDatePart(Date dateTime) {
        TimeZone tz = TimeZone.getDefault();
        long rawOffset=tz.getRawOffset();
        long dst=(tz.inDaylightTime(dateTime)?tz.getDSTSavings():0);
        long dt=dateTime.getTime()+rawOffset+dst; //add offseet and dst to dateTime
        long modDt=dt % (60*60*24*1000) ;
    
        return new Date( dt
                        - modDt //substract the rest of the division by a day in milliseconds
                        - rawOffset //substract the time offset (Paris = GMT +1h for example)
                        - dst //If dayLight, substract hours (Paris = +1h in dayLight)
        );
    }

    Android API de nivel 1, no externo de la biblioteca.
    Respeta la luz del día y zona horaria por defecto. No hay manipulación de cadenas, así que creo que esta forma es de CPU más eficiente que el suyo, pero no he hecho ninguna prueba.

  21. 0

    Yo puede utilizar joda tiempo.

    private Date dateWitoutTime(Date date){
     return new LocalDate(date).toDate()
    }

    con:

    Date date = new Date();
    System.out.println("Without Time = " + dateWitoutTime(date) + "/n  With time = " + date);

Kommentieren Sie den Artikel

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

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...