Continuando con el programa Java Stack Overflow question para obtener la fecha actual sin marca de tiempo :
¿Cuál es la forma más eficiente de obtener un objeto Date sin la hora? ¿Hay alguna otra manera que 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 :
Sabía sobre Joda-Time ; Solo estoy tratando de evitar una biblioteca adicional para una tarea tan simple (creo). Pero según las respuestas hasta ahora, Joda-Time parece extremadamente popular, por lo que podría considerarlo.
Por eficiente , quiero decir que quiero evitar la
String
creación de objetos temporales como los usamethod 1
, mientras tantomethod 2
parece un truco en lugar de una solución.
Respuestas:
¿Usted absolutamente tiene a su uso
java.util.Date
? Yo a fondo recomendamos que utilice Tiempo Joda o eljava.time
paquete de Java 8 en su lugar. En particular, aunque la fecha y calendario siempre representan un momento determinado en el tiempo, sin concepto como "sólo una fecha", Joda Time no tiene un tipo que representa este (LocalDate
). Su código será mucho más claro si puede usar tipos que representan lo que realmente está tratando de hacer.Hay muchas, muchas otras razones para usar Joda Time o en
java.time
lugar de losjava.util
tipos incorporados : generalmente son API mucho mejores. Siempre puede convertir a / desde ajava.util.Date
en los límites de su propio código si es necesario, por ejemplo, para la interacción de la base de datos.fuente
Date
objeto; esa respuesta formatea una fecha en una cadena, que no es lo mismo. Fundamentalmente, preguntar en qué fechaDate
es una pregunta sin sentido sin más información: la zona horaria y el sistema de calendario que está utilizando.Esto es lo que solía obtener la fecha de hoy con la hora establecida en
00:00:00
:fuente
Puede usar DateUtils.truncate de la biblioteca Apache Commons.
Ejemplo:
fuente
Sí hay.
java.time
Java 8 y posterior viene con el nuevo paquete java.time incorporado. Ver tutorial . Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport y se adapta aún más a Android en ThreeTenABP .
Similar a Joda-Time , java.time ofrece una
LocalDate
clase para representar un valor de solo fecha sin hora del día y sin zona horaria.Tenga en cuenta que la zona horaria es crítica para determinar una fecha en particular. A la medianoche en París, por ejemplo, la fecha todavía es "ayer" en Montreal.
De forma predeterminada, java.time utiliza el estándar ISO 8601 para generar una representación de cadena de una fecha o valor de fecha y hora. (Otra similitud con Joda-Time.) Simplemente llame
toString()
para generar texto como2015-05-21
.Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
TimeZone.setDefault
durante el tiempo de ejecución y afectar inmediatamente a todos los demás códigos que se ejecutan en esa JVM. Moraleja de la historia: siempre especifique una zona horaria.La forma más directa:
fuente
long dateOnly = (currentTime / millisInDay) * millisInDay;
lo mismo que escribirlong dateOnly = currentTime;
?La respuesta estándar a estas preguntas es usar Joda Time . La API es mejor y si está utilizando formateadores y analizadores puede evitar la falta no intuitiva de seguridad de subprocesos
SimpleDateFormat
.Usar Joda significa que simplemente puedes hacer:
Actualización :: Usando java 8 esto se puede lograr usando
fuente
LocalDate
clase similar a Joda-Time.DateTimeZone
constructor de LocalDate. La determinación de la fecha actual depende de la zona horaria, ya que París comienza una nueva fecha anterior a Montreal. Si omite la zona horaria, se aplica la zona horaria predeterminada de su JVM. Por lo general, es mejor especificar que confiar en el valor predeterminado.Esta es una manera simple de hacerlo:
fuente
No tiene sentido hablar de una fecha sin una marca de tiempo con respecto a las rutinas de fecha en el tiempo de ejecución estándar de Java, ya que esencialmente se asigna a un milisegundo específico y no a una fecha. Dicho milisegundo tiene intrínsecamente una hora del día que lo hace vulnerable a problemas de zona horaria como el horario de verano y otros ajustes de calendario. Ver ¿Por qué restar estas dos veces (en 1927) está dando un resultado extraño? Por un ejemplo interesante.
Si desea trabajar con fechas en lugar de milisegundos, debe usar otra cosa. Para Java 8 hay un nuevo conjunto de métodos que proporcionan exactamente lo que solicita. Para Java 7 y versiones anteriores, use http://www.joda.org/joda-time/
fuente
Definitivamente no es la forma más correcta, pero si solo necesita una solución rápida para obtener la fecha sin la hora y no desea utilizar una biblioteca de terceros, esto debería hacerlo
Solo necesitaba la fecha para fines visuales y no podía Joda, así que me limité.
fuente
fuente
Bueno, hasta donde sé, no hay una manera más fácil de lograr esto si solo usa el JDK estándar.
Por supuesto, puede poner esa lógica en el método 2 en una función estática en una clase auxiliar, como se hace aquí en el método toBeginningOfTheDay
Entonces puedes acortar el segundo método para:
O bien, si realmente necesita el día actual en este formato con tanta frecuencia, puede envolverlo en otro método auxiliar estático, lo que lo convierte en una línea.
fuente
Si todo lo que quiere es ver la fecha así "AAAA-MM-DD" sin todo el desorden, por ejemplo, "jue 21 de mayo 12:08:18 EDT 2015", entonces simplemente use
java.sql.Date
. Este ejemplo obtiene la fecha actual:También
java.sql.Date
es una subclase dejava.util.Date
.fuente
Si solo necesita la fecha actual, sin hora, otra opción es:
fuente
00:00:00
general , ese tiempo (puede variar según la zona horaria para anomalías como el horario de verano) ). Entonces, como señalan otras Respuestas, laLocalDate
clase es más apropiada, desde Joda-Time (suponiendo que hace referencia a Joda-Time, que debe tener en cuenta explícitamente al citar clases no incluidas en Java).Use
LocalDate.now()
y convierta en loDate
siguiente:fuente
TimeZone.setDefault
. Su código está llamandoZoneId.systemDefault
dos veces, el primero está implícitoLocalDate.now()
y el segundo es explícito conatStartOfDay
. Entre esos dos momentos en tiempo de ejecución, la zona predeterminada actual podría cambiar. Sugiero capturar la zona en una variable y pasar a ambos métodos.Si necesita la parte de fecha solo para hacer eco, entonces
fuente
¿Qué hay de esto?
fuente
Echa un vistazo a Veyder-time . Es una alternativa simple y eficiente tanto para java.util como para Joda-time. Tiene una API intuitiva y clases que representan fechas solas, sin marcas de tiempo.
fuente
La forma más directa que hace uso completo de la enorme base de datos TimeZone de Java y es correcta:
fuente
Aquí hay una solución limpia sin conversión a cadena y viceversa, y tampoco vuelve a calcular el tiempo varias veces a medida que restablece cada componente del tiempo a cero. También usa
%
(módulo) en lugar de dividir seguido de multiplicar para evitar la doble operación.No requiere dependencias de terceros, y RESPETE EL TIMEZONE OF the Calender que se pasó. Esta función devuelve el momento en el tiempo a las 12 AM en la zona horaria de la fecha (Calendario) que pasa.
fuente
Prefiero no usar bibliotecas de terceros tanto como sea posible. Sé que esta manera se menciona antes, pero aquí hay una manera limpia y agradable:
Bueno, ¡no usar GregorianCalendar es quizás una opción!
fuente
Acabo de hacer esto para mi aplicación:
Android API nivel 1, sin biblioteca externa. Respeta la luz del día y la zona horaria predeterminada. Sin manipulación de cadenas, así que creo que de esta manera es más eficiente la CPU que la suya, pero no he realizado ninguna prueba.
fuente
Puedes usar el tiempo joda.
y llamas con:
fuente