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