studio servidor obtener ingresar hora fecha exacta clase actual java java.util.calendar

java - servidor - Establecer la hora a 00:00:00



obtener hora del servidor java (8)

Tengo un problema para restablecer horas en Java. Para una fecha determinada, quiero establecer el horario en 00:00:00.

Este es mi código:

/** * Resets milliseconds, seconds, minutes and hours from the provided date * * @param date * @return */ public static Date trim(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.HOUR, 0); return calendar.getTime(); }

El problema es que a veces la hora es 12:00:00 y a veces es 00:00:00 y cuando consulto la base de datos para una entidad que se guardó el 07.02.2013 00:00:00 y el tiempo real de la entidad, eso se almacena, es 12:00:00 la consulta falla.

¡Lo sé a las 12:00:00 == 00:00:00 !

Estoy usando App Engine. ¿Es esto una falla de appengine, un problema o algún otro problema? ¿O depende de otra cosa?


java.time

Usar el marco java.time integrado en Java 8 y posterior. Ver Tutorial .

import java.time.LocalTime; import java.time.LocalDateTime; LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224 # start of a day now.with(LocalTime.MIN); # 2015-11-19T00:00 now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00

Si no necesita partes de hora del día (horas, minutos, segundos, etc.), considere usar la clase java.time .

LocalDate.now(); # 2015-11-19


Aquí hay un par de funciones de utilidad que utilizo para hacer esto.

/** * sets all the time related fields to ZERO! * * @param date * * @return Date with hours, minutes, seconds and ms set to ZERO! */ public static Date zeroTime( final Date date ) { return DateTimeUtil.setTime( date, 0, 0, 0, 0 ); } /** * Set the time of the given Date * * @param date * @param hourOfDay * @param minute * @param second * @param ms * * @return new instance of java.util.Date with the time set */ public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms ) { final GregorianCalendar gc = new GregorianCalendar(); gc.setTime( date ); gc.set( Calendar.HOUR_OF_DAY, hourOfDay ); gc.set( Calendar.MINUTE, minute ); gc.set( Calendar.SECOND, second ); gc.set( Calendar.MILLISECOND, ms ); return gc.getTime(); }


Hacer esto podría ser más fácil (en Java 8)

LocalTime.ofNanoOfDay(0)


Lo mejor sería configurar principalmente la zona horaria para el componente DateFormat como este:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

Luego puede obtener el tiempo "00:00:00" pasando 0 milisegundos al formateador:

String time = dateFormat.format(0);

o puede crear el objeto Date:

Date date = new Date(0); // also pass milliseconds String time = dateFormat.foramt(date);

o puede tener más posibilidades usando el componente Calendario, pero también debe establecer la zona horaria como GMT en la instancia del calendario:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); calendar.set(Calendar.HOUR_OF_DAY, 5); calendar.set(Calendar.MINUTE, 37); calendar.set(Calendar.SECOND, 27); dateFormat.format(calendar.getTime());


Otra forma de hacerlo sería usar un DateFormat sin segundos:

public static Date trim(Date date) { DateFormat format = new SimpleDateFormat("dd.MM.yyyy"); Date trimmed = null; try { trimmed = format.parse(format.format(date)); } catch (ParseException e) {} // will never happen return trimmed; }


Puede hacer esto con lo siguiente:

Calendar cal = Calendar.getInstance(); cal.set(year, month, dayOfMonth, 0, 0, 0); Date date = cal.getTime();


Una forma más de JAVA 8:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

Pero es mucho más útil editar la fecha que ya existe.


Use otra constante en lugar de Calendar.HOUR , use Calendar.HOUR_OF_DAY .

calendar.set(Calendar.HOUR_OF_DAY, 0);

Calendar.HOUR usa 0-11 (para usar con AM / PM) y Calendar.HOUR_OF_DAY usa 0-23.

Para citar los Javadocs:

público estático final int HORA

Número de campo para get y set que indica la hora de la mañana o la tarde. HOUR se usa para el reloj de 12 horas (0 - 11). El mediodía y la medianoche están representados por 0, no por 12. Por ejemplo, a las 10: 04: 15.250 PM, la HORA es 10.

y

público estático final int HOUR_OF_DAY

Número de campo para get y set que indica la hora del día. HOUR_OF_DAY se usa para el reloj de 24 horas. Por ejemplo, a las 10: 04: 15.250 PM el HOUR_OF_DAY es 22.

Pruebas ("ahora" es actualmente alrededor de las 14:55 del 23 de julio de 2013, horario de verano del Pacífico):

public class Main { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) { Calendar now = Calendar.getInstance(); now.set(Calendar.HOUR, 0); now.set(Calendar.MINUTE, 0); now.set(Calendar.SECOND, 0); System.out.println(sdf.format(now.getTime())); now.set(Calendar.HOUR_OF_DAY, 0); System.out.println(sdf.format(now.getTime())); } }

Salida:

$ javac Main.java $ java Main 2013-07-23 12:00:00 2013-07-23 00:00:00