Java: getMinutes y getHours

142

¿Cómo obtienes Horas y Minutos desde entonces Date.getHoursy te Date.getMinutesdesaprobaron? Los ejemplos que encontré en la búsqueda de Google utilizaron los métodos obsoletos.

rink.attendant.6
fuente
2
Para su información, las clases de fecha y hora terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque

Respuestas:

171

Intente usar Joda Time en lugar de las clases estándar java.util.Date. La biblioteca Joda Time tiene una API mucho mejor para manejar fechas.

DateTime dt = new DateTime();  // current time
int month = dt.getMonth();     // gets the current month
int hours = dt.getHourOfDay(); // gets hour of day

Consulte esta pregunta para conocer los pros y los contras del uso de la biblioteca Joda Time.

Joda Time también se puede incluir en alguna versión futura de Java como componente estándar, consulte JSR-310 .


Si debe usar las clases tradicionales java.util.Date y java.util.Calendar, consulte sus JavaDoc para obtener ayuda ( java.util.Calendar y java.util.Date ).

Puede usar las clases tradicionales como esta para recuperar campos de una instancia de Date dada.

Date date = new Date();   // given date
Calendar calendar = GregorianCalendar.getInstance(); // creates a new calendar instance
calendar.setTime(date);   // assigns calendar to given date 
calendar.get(Calendar.HOUR_OF_DAY); // gets hour in 24h format
calendar.get(Calendar.HOUR);        // gets hour in 12h format
calendar.get(Calendar.MONTH);       // gets month number, NOTE this is zero based!
Juha Syrjälä
fuente
2
Pregunta: Ahora que Java 8 se ha implementado con LocalDateTime, ¿hay alguna razón por la que deba usar Joda Time sobre LocalDateTime?
Chrips
@Chrips Las opiniones difieren. Joda-Time recomienda oficialmente usar java.time en su lugar.
Ole VV
96

Del Javadoc para Date.getHours

As of JDK version 1.1, replaced by Calendar.get(Calendar.HOUR_OF_DAY)

Entonces usa

Calendar rightNow = Calendar.getInstance();
int hour = rightNow.get(Calendar.HOUR_OF_DAY);

y el equivalente para getMinutes.

marca
fuente
66
Entonces ... ¿cómo funciona esto si quiero obtener las horas de una Fecha que no corresponde a ahora?
Michael
Esta clase terrible fue suplantada hace años por las clases modernas de java.time , con la adopción de JSR 310. Use en su ZonedDateTimelugar.
Basil Bourque
58

java.time

Si bien soy fanático de Joda-Time , Java 8 presenta el paquete java.time , que finalmente es una solución estándar de Java que vale la pena. Lea este artículo, Java SE 8 Date and Time , para obtener una buena cantidad de información sobre java.time fuera de las horas y minutos.

En particular, mira la LocalDateTimeclase.

Horas y minutos:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();
JD
fuente
44
Esta es la mejor respuesta. Es posible que desee para proporcionar la zona horaria explícita para recordar al lector y se que esta es una operación delicada zona horaria: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Lea now()solo una vez por coherencia (el tiempo pasará entre las dos llamadas). Si la fecha es realmente irrelevante, LocalTimetambién funciona.
Ole VV
1
Gracias por esto. ¡De alguna manera, HE PERDIDO esta maravillosa clase incorporada durante mucho tiempo!
Chrips
El comentario de Ole VV es correcto. Pero aún mejor, use ZonedDateTimeclass en lugar de LocalDateTime. Con LocalDateTimeusted está descartando información valiosa de zona horaria sin ningún motivo, sin ganar nada.
Basil Bourque
Útil si no tiene que ser compatible con versiones anteriores. Lamentablemente, no es adecuado si está escribiendo para Android y admite versiones anteriores de API (o en cualquier otro caso cuando Java 8 no siempre está disponible).
M_M
@M_M Para Java 6 y 7, la mayor parte del java.time funcionalidad se back-portados en el ThreeTen-Backport biblioteca. Más adaptado a los primeros Android en ThreeTenABP . Para enlaces, vea la última sección de mi respuesta .
Basil Bourque
36

Primero, importe java.util.Calendar

Calendar now = Calendar.getInstance();
System.out.println(now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE));
James
fuente
12

tl; dr

ZonedDateTime.now().getHour()

... o ...

LocalTime.now().getHour() 

ZonedDateTime

La respuesta de JD es buena pero no óptima. Esa respuesta usa la LocalDateTimeclase. Sin ningún concepto de zona horaria o desplazamiento desde UTC, esa clase no puede representar un momento.

Mejor de usar ZonedDateTime.

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

Especificar zona horaria

Si omite el ZoneIdargumento, uno se aplica implícitamente en tiempo de ejecución utilizando la zona horaria predeterminada actual de la JVM.

Así que esto:

ZonedDateTime.now()

... es lo mismo que esto:

ZonedDateTime.now( ZoneId.systemDefault() )

Es mejor ser explícito, pasando su zona horaria deseada / esperada. El valor predeterminado puede cambiar en cualquier momento durante el tiempo de ejecución.

Si es crítico, confirme la zona horaria con el usuario.

Hora-minuto

Interrogar el ZonedDateTimepor la hora y los minutos.

int hour = zdt.getHour() ;
int minute = zdt.getMinute() ;

LocalTime

Si desea solo la hora del día sin la zona horaria, extraiga LocalTime.

LocalTime lt = zdt.toLocalTime() ;

O salte por ZonedDateTimecompleto, yendo directamente a LocalTime.

LocalTime lt = LocalTime.now( z ) ;  // Capture the current time-of-day as seen in the wall-clock time used by the people of a particular region (a time zone).

tipos java.time

Tabla de tipos de clases de fecha y hora en java.time moderno versus heredado.


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, y SimpleDateFormat.

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 .

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

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de java.sql.*clases.

¿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 .

Albahaca Bourque
fuente
3
int hr=Time.valueOf(LocalTime.now()).getHours();
int minutes=Time.valueOf(LocalTime.now()).getMinutes();

Estas funciones devolverán valores int en horas y minutos.

Nouran El Kassas
fuente
1
Duplicar. Este enfoque ya estaba cubierto en la respuesta de JD .
Basil Bourque
Es eso java.sql.Time? Ciertamente no hay ninguna razón para poner esa clase obsoleta en juego cuando tienesjava.time.LocalTime . Eres demasiado complicado.
Ole VV
Parece que getMinutes()ha quedado en desuso (estoy usando Java 1.8) y ha sido reemplazado porCalendar.get(Calendar.MINUTE)
Saltz3
3

Una forma más de obtener minutos y horas es mediante SimpleDateFormat.

SimpleDateFormat formatMinutes = new SimpleDateFormat("mm")
String getMinutes = formatMinutes.format(new Date())

SimpleDateFormat formatHours = new SimpleDateFormat("HH")
String getHours = formatHours.format(new Date())
Paka
fuente
Para su información, las clases de fecha y hora terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque
2

Recomendaría mirar ad joda time. http://www.joda.org/joda-time/

Tenía miedo de agregar otra biblioteca a mi proyecto grueso, pero es fácil, rápido, inteligente e increíble. Además, juega bien con el código existente, hasta cierto punto.

alamar
fuente
1

Si bien no recomendaría hacerlo, creo que vale la pena señalar que, aunque muchos métodos en java.util.Date han quedado en desuso, todavía funcionan. En situaciones triviales, puede estar bien usarlos. Además, java.util.Calendar es bastante lento, por lo que getMonth y getYear on Date podrían ser más rápidos.

skaffman
fuente
1
public static LocalTime time() {
    LocalTime ldt = java.time.LocalTime.now();

    ldt = ldt.truncatedTo(ChronoUnit.MINUTES);
    System.out.println(ldt);
    return ldt;
}

Esto funciona para mi

Huey
fuente
0

import java.util.*Puede gethour y minutos usando la clase calendario y formateador. Calendar cal = Calendar.getInstance()y Formatter fmt=new Formatter()establecer un formato para mostrar horas y minutos fmt.format("%tl:%M",cal,cal)y la System.out.println(fmt) salida de impresión se muestra10:12

Benjamín
fuente