Obtener una marca de tiempo para el inicio del día

Estoy almacenando los tiempos / fechas en una base de datos usando una marca de tiempo unix. Quiero entonces conseguir todas las instancias en cierto día así que por lo tanto necesito calcular la marca de tiempo para el comienzo del día para consultar la base de datos.

He hecho una cosa similar en php pasando mktime los valores para el día / mes / año de un objeto de fecha y el ajuste de hora y minuto a cero. No parece haber funciones similares para esto en java / android (las funciones para obtener las partes específicas de la fecha están en desuso)

¿Puede alguien dar alguna orientación sobre esto? Gracias

Editar:

Ok, así que me di cuenta de esto podría funcionar:

public static int startOfDay(Timestamp time) { Calendar cal = dateToCalendar(new Date(time.getTime())); cal.add(Calendar.HOUR_OF_DAY, -Calendar.HOUR_OF_DAY); cal.add(Calendar.MINUTE, -Calendar.MINUTE); cal.add(Calendar.SECOND, -Calendar.SECOND); Log.i("Time", cal.getTime().toString()); return (int) cal.getTimeInMillis()/1000; } 

Sin embargo, cuando corrí esto ahora tengo:

Sáb dic 15 01:24:00 GMT 2012

Los segundos son correctos pero la hora y el minuto son incorrectos ??

Cuando se trata de tiempo, siempre debe considerar las zonas horarias. Las marcas de hora de la base de datos deben almacenarse siempre en una zona horaria (por ejemplo, UTC). Su cálculo debe considerar que los usuarios pueden estar en diferentes husos horarios y que pueden cambiar las zonas horarias.

Si desea calcular el inicio del día en la zona horaria, el usuario se ha configurado actualmente en su teléfono. Cree la instancia de Calendar con:

 Calendar cal = Calendar.getInstance(); 

Para obtener la instancia de una zona horaria específica, utilice:

 // use UTC time zone Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 

A continuación, establezca el comienzo del día:

 cal.setTime(time); // compute start of the day for the timestamp cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); 
 public static int startOfDay(Timestamp time) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(time.getTime()); cal.set(Calendar.HOUR_OF_DAY, 0); //set hours to zero cal.set(Calendar.MINUTE, 0); // set minutes to zero cal.set(Calendar.SECOND, 0); //set seconds to zero Log.i("Time", cal.getTime().toString()); return (int) cal.getTimeInMillis()/1000; } 

Tl dr

 ZoneId z = ZoneId.of( "America/Montreal" ); long secondsSinceEpoch = ZonedDateTime.now( z ).toLocalDate().asStartOfDay( z ).toEpochSecond() ; 

Detalles

La respuesta aceptada por Tomik es correcta pero anticuada. Las difíciles clases de fecha-hora heredadas han sido suplantadas por las clases java.time.

Como respuesta aconsejó, debe considerar la zona horaria al obtener el comienzo de un día. Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del globo por la zona. Por ejemplo, unos pocos minutos después de la medianoche en París Francia es un nuevo día, mientras que todavía "ayer" en Montreal Quebec.

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

Conseguir el primer momento del día requiere pasar por LocalDate . La clase LocalDate representa un valor de fecha única sin hora del día y sin zona horaria.

 LocalDate today = zdt.toLocalDate(); ZonedDateTime zdtTodayStart = today.atStartOfDay( z ); 

Tenga en cuenta que dejamos que java.time determine el inicio del día en lugar de asumir y codificar duro 00:00:00 . Debido al horario de verano (DST) y otras anomalías, el día puede comenzar en otro momento, como 01:00:00 .

Al parecer, por unix timestamp significa un recuento de segundos enteros desde el primer momento de 1970 en UTC. La clase ZonedDateTime tiene un método para darle ese número. Tenga en cuenta que esto puede significar la pérdida de datos como ZonedDateTime puede tener una fracción de segundo con resolución de nanosegundos.

 long secondsSinceEpoch = zdtTodayStart.toEpochSecond(); 

Acerca de java.time

El framework java.time está integrado en Java 8 y posterior. Estas clases suplantan las difíciles viejas clases de fecha y hora como java.util.Date , .Calendar , y java.text.SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , recomienda la migración a java.time.

Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones.

Gran parte de la funcionalidad de java.time es back-portada a Java 6 & 7 en ThreeTen-Backport y adaptada además a Android en ThreeTenABP (consulte Cómo usar … ).

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno probatorio para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles como Interval , YearWeek , YearQuarter y más.

¿Qué piensas de esta solución simple?

 Long currentDayStart = timestamp - timestamp%86400000; Long currentDayEnd = timestamp+86399999; 

Cambiar los husos horarios de la marca de tiempo es innecesario. Más información aquí: https://stackoverflow.com/a/23062640

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.