Java: getMinutes et getHours

142

Comment obtenez-vous des heures et des minutes depuis Date.getHourset êtes-vous Date.getMinutesobsolète? Les exemples que j'ai trouvés sur la recherche Google utilisent les méthodes obsolètes.

patinoire.attendant.6
la source
2
Pour info, les classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Basil Bourque

Réponses:

171

Essayez d'utiliser Joda Time au lieu des classes java.util.Date standard. La bibliothèque Joda Time a une bien meilleure API pour gérer les dates.

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

Consultez cette question pour connaître les avantages et les inconvénients de l'utilisation de la bibliothèque Joda Time.

Joda Time peut également être inclus dans une future version de Java en tant que composant standard, voir JSR-310 .


Si vous devez utiliser les classes traditionnelles java.util.Date et java.util.Calendar, consultez leur JavaDoc pour obtenir de l'aide ( java.util.Calendar et java.util.Date ).

Vous pouvez utiliser les classes traditionnelles comme celle-ci pour récupérer les champs d'une instance de Date donnée.

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ä
la source
2
Question: Maintenant que Java 8 a été déployé avec LocalDateTime, y a-t-il une raison pour laquelle vous devriez utiliser Joda Time sur LocalDateTime?
chrips
Les opinions de @Chrips diffèrent. Joda-Time recommande officiellement d'utiliser java.time à la place.
Ole VV
96

Depuis la Javadoc pour Date.getHours

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

Alors utilisez

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

et l'équivalent pour getMinutes.

marque
la source
6
Alors ... comment ça marche si je veux obtenir les heures d'une date qui ne correspond pas à maintenant?
Michael
Cette terrible classe a été supplantée il y a des années par les classes java.time modernes , avec l'adoption de JSR 310. Utilisez à la ZonedDateTimeplace.
Basil Bourque
58

java.time

Bien que je sois fan de Joda-Time , Java 8 présente le package java.time qui est enfin une solution standard Java intéressante! Lisez cet article, Java SE 8 Date et heure , pour une bonne quantité d'informations sur java.time en dehors des heures et des minutes.

En particulier, regardez la LocalDateTimeclasse.

Heures et minutes:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();
JD
la source
4
C'est la meilleure réponse. Vous pouvez fournir fuseau horaire explicite de rappeler au lecteur et vous que c'est un fuseau horaire opération sensible: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Lire now()une seule fois pour la cohérence (le temps passera entre les deux appels). Si la date est vraiment hors de propos, LocalTimefonctionne aussi.
Ole VV
1
Merci pour ça. J'ai en quelque sorte MANQUÉ ce merveilleux construit en classe pendant longtemps!
chrips
Le commentaire d'Ole VV est correct. Mais mieux encore, utilisez la ZonedDateTimeclasse plutôt que LocalDateTime. Avec LocalDateTimevous, vous supprimez des informations de fuseau horaire précieuses sans raison, sans rien gagner.
Basil Bourque
Utile si vous n'avez pas besoin d'être rétrocompatible. Malheureusement, ne convient pas si vous écrivez pour Android et supportez des versions d'API plus anciennes (ou dans tout autre cas lorsque Java 8 n'est pas toujours disponible).
M_M
@M_M Pour Java 6 & 7, la plupart des fonctionnalités java.time sont back-portées dans la bibliothèque ThreeTen-Backport . Adapté davantage au début d'Android dans ThreeTenABP . Pour les liens, consultez la dernière section de ma réponse .
Basil Bourque
36

Tout d'abord, importez java.util.Calendar

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

tl; dr

ZonedDateTime.now().getHour()

… ou …

LocalTime.now().getHour() 

ZonedDateTime

La réponse de JD est bonne mais pas optimale. Cette réponse utilise la LocalDateTimeclasse. N'ayant aucun concept de fuseau horaire ou de décalage par rapport à UTC, cette classe ne peut pas représenter un moment.

Mieux vaut utiliser ZonedDateTime.

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

Spécifiez le fuseau horaire

Si vous omettez l' ZoneIdargument, l'un est appliqué implicitement au moment de l'exécution en utilisant le fuseau horaire par défaut actuel de la JVM.

Donc ça:

ZonedDateTime.now()

… Est la même chose:

ZonedDateTime.now( ZoneId.systemDefault() )

Mieux vaut être explicite, en passant votre fuseau horaire souhaité / attendu. La valeur par défaut peut changer à tout moment pendant l'exécution.

S'il est critique, confirmez le fuseau horaire avec l'utilisateur.

Heure-minute

Interrogez le ZonedDateTimepour l'heure et la minute.

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

LocalTime

Si vous voulez juste l'heure du jour sans le fuseau horaire, extrayez LocalTime.

LocalTime lt = zdt.toLocalTime() ;

Ou passez ZonedDateTimeentièrement à 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).

types java.time

Tableau des types de classes date-heure dans java.time moderne par rapport à l'héritage.


À propos java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, &SimpleDateFormat .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Le projet Joda-Time , désormais en mode maintenance , conseille de migrer vers java.time classes .

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de cordes, pas besoin dejava.sql.* classes.

Où obtenir les classes java.time?

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
6

Essayez Calender. Utilisez getInstance pour obtenir un Calender-Object. Utilisez ensuite setTime pour définir la date requise. Vous pouvez maintenant utiliser get (int field) avec la constante appropriée comme HOUR_OF_DAY ou plus pour lire les valeurs dont vous avez besoin.

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html

Tobias Langner
la source
3
int hr=Time.valueOf(LocalTime.now()).getHours();
int minutes=Time.valueOf(LocalTime.now()).getMinutes();

Ces fonctions renverront des valeurs int en heures et minutes.

Nouran El Kassas
la source
1
Dupliquer. Cette approche était déjà couverte dans la réponse de JD .
Basil Bourque
C'est ça java.sql.Time? Certainement aucune raison de mettre en jeu cette classe obsolète quand vous en avez java.time.LocalTime. Vous compliquez trop.
Ole VV
Il semble que cela getMinutes()a été obsolète dans (j'utilise java 1.8) et a été remplacé parCalendar.get(Calendar.MINUTE)
Saltz3
3

Une autre façon d'obtenir des minutes et des heures consiste à utiliser SimpleDateFormat.

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

SimpleDateFormat formatHours = new SimpleDateFormat("HH")
String getHours = formatHours.format(new Date())
Paka
la source
Pour info, les classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Basil Bourque
2

Je recommanderais de regarder ad joda time. http://www.joda.org/joda-time/

J'avais peur d'ajouter une autre bibliothèque à mon projet épais, mais c'est juste facile et rapide et intelligent et génial. De plus, il joue bien avec le code existant, dans une certaine mesure.

alamar
la source
1

Bien que je ne le recommande pas, je pense qu'il vaut la peine de souligner que bien que de nombreuses méthodes sur java.util.Date soient obsolètes, elles fonctionnent toujours. Dans des situations triviales, il peut être acceptable de les utiliser. De plus, java.util.Calendar est assez lent, donc getMonth et getYear on Date pourraient être utilement plus rapides.

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

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

Cela fonctionne pour moi

Huey
la source
0

import java.util.*Vous pouvez obtenir l'heure et les minutes en utilisant le calendrier et la classe de formateur. Calendar cal = Calendar.getInstance()et Formatter fmt=new Formatter()et définissez un format pour l'affichage des heures et des minutes fmt.format("%tl:%M",cal,cal)et la System.out.println(fmt) sortie d' impression montre comme10:12

Benjamin
la source