Pourquoi ne puis-je pas obtenir une durée en minutes ou en heures en java.de temps?
De la Durée
classe dans la nouvelle JSR 310 date de l'API (java.en temps) disponibles dans Java 8 et, plus tard, la javadoc dit :
Cette classe de modèles d'une quantité ou une quantité de temps en termes de secondes et
nanosecondes. Il peut être consulté à l'aide d'autres en fonction de la duration des unités, telles
comme les minutes et les heures.En outre, les JOURS de l'unité peut être utilisée et elle est considérée comme égale à 24 heures, ignorant ainsi les effets de l'heure d'été.
Alors, pourquoi le code suivant crash ?
Duration duration = Duration.ofSeconds(3000);
System.out.println(duration.get(ChronoUnit.MINUTES));
Cela soulève une UnsupportedTemporalTypeException
:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Minutes
at java.time.Duration.get(Duration.java:537)
Alors, quelle est la méthode recommandée pour extraire les minutes et les heures à partir d'une durée d'objet ? Avons-nous les faire le calcul nous-mêmes à partir du nombre de secondes ? Pourquoi était-il mis en œuvre de cette façon ?
- stackoverflow.com/questions/20827047/... (le non-accepté de répondre)
- Pour info, il y a un projet d'extension de java.temps, ThreeTen Extra. Mais je ne pense pas qu'il a actuellement rien pour vous aider.
- Semble que JSR 310 java.le temps n'est pas tout ce que nous espérions. Elle n'est pas complète et supérieure de remplacement pour Joda-Time. Alors que java.le temps a ses points forts, afin de ne Joda-Time. Joda-Time propose trois classes de manipulation d'un laps de temps (Durée, Période, Intervalle), a une bonne prise en charge intégrée de la norme ISO 8601 représentation de chaîne des travées, et un bon support pour la définition de vos propres formateurs.
- Ouais, j'étais encore à l'aide de l'ancienne Date de l'API, en attente pour le 310, mais maintenant je pense, vais-je aller avec Joda à la place. Mais les 310 API est encore beaucoup mieux que l'ancienne Date un!
- Heureusement, on peut utiliser à la fois à java.temps et Joda-Time, l'application soit dans le cas où ses forces ont du mérite. Juste être prudent avec votre
import
déclarations qu'ils partagent quelques noms de classe (LocalDate
etc.). Pour plus de clarté, je vous suggère de ne jamais mélanger java.temps et Joda-Time dans le même bloc de code. Comme pour ces vieuxjava.util.Date
&.Calendar
&SimpleDateFormat
, certainement éviter.
Vous devez vous connecter pour publier un commentaire.
"Pourquoi était-il mis en œuvre de cette façon?"
D'autres réponses traitent de la
toXxx()
méthodes qui permettent de les heures/minutes pour être interrogé. Je vais essayer de traiter avec le pourquoi.La
TemporalAmount
interface etget(TemporalUnit)
méthode a été ajoutée assez tard dans le processus. Personnellement, je n'était pas entièrement convaincu que nous avons eu assez de preuves de la bonne façon de travailler de la conception dans ce domaine, mais a été légèrement le bras tordu pour ajouterTemporalAmount
. Je crois que nous avons un peu confus de l'API.Avec le recul, je crois que
TemporalAmount
contient les bonnes méthodes, mais je crois queget(TemporalUnit)
devrait avoir un autre nom de la méthode. La raison en est queget(TemporalUnit)
est essentiellement un cadre au niveau de la méthode, il n'est pas conçu pour la journée d'aujourd'hui utilisent. Malheureusement, le nom de la méthodeget
n'implique pas cela, résultant en des bugs comme appelerget(ChronoUnit.MINUTES)
surDuration
.Ainsi, la manière de penser de
get(TemporalUnit)
est d'imaginer un framework de bas niveau de l'affichage de la quantité comme uneMap<TemporalUnit, Long>
oùDuration
est unMap
de taille deux, avec des touches deSECONDS
etNANOS
.De la même façon,
Period
est considéré à partir du bas niveau des cadresMap
de la taille de troisDAYS
,MONTHS
etYEARS
(qui heureusement a moins de risques d'erreurs).Dans l'ensemble, les meilleurs conseils pour le code de l'application est d'ignorer la méthode
get(TemporalUnit)
. UtilisationgetSeconds()
,getNano()
,toHours()
ettoMinutes()
à la place.Enfin, une façon de faire "hh:mm:ss" à partir d'un
Duration
est à faire:Pas joli du tout, mais il fonctionne pour des durées de moins d'une journée.
Nouveau
to…Part
méthodes en Java 9JDK-8142936 question maintenant implémenté en Java 9, en ajoutant des méthodes suivantes pour accéder à chaque partie d'un
Duration
.toDaysPart
toHoursPart
toMinutesPart
toSecondsPart
toMillisPart
toNanosPart
La la documentation dit:
Donc, estimation meilleure réponse: c'est la façon dont ils ont imaginé.
Vous pouvez utiliser certaines des méthodes pour l'obtenir en heures:
ou minutes:
10000
secondes, letoMinutes()
méthode sera de retour 166. Pas si utile que si vous avez besoin de faire afficherhh:mm:ss
, mais peut être utilisé comme partie d'une plus complète de la méthode de calcul.duration.toString()
pour obtenir la durée sous forme lisible par l'homme de valeurint hours = (int) ( duration.toHours() % 24L );
Pour obtenir l'heure/minute/seconde composants dans un "normalisé", vous avez besoin de les calculer manuellement le code ci-dessous est essentiellement copié à partir de la
Duration#toString
méthode:Je voudrais ajouter à bigt de réponse (+1) qui a souligné l'utile
toHours
,toMinutes
et d'autres méthodes de conversion. Le La durée de la spécification dit:Il existe une variété de getter des méthodes telles que
getSeconds
,getNano
, etget(TemporalUnit)
. Étant donné qu'une durée est représentée comme un (secondes, les nanos) de la paire, il est clair pourquoiget(TemporalUnit)
est limitée à quelques secondes et nanos. Ces méthodes de lecture d'extraire des données directement à partir de la durée de l'instance et sont sans perte de qualité.En revanche, il existe une variété de méthodes, y compris
toDays
,toHours
,toMillis
toMinutes
, ettoNanos
qui ne conversion sur la valeur de durée. Ces conversions sont à perte, en ce qu'ils impliquent la troncature des données, ou ils peuvent lever une exception si la valeur de la durée ne peut pas être représentée dans le format demandé.C'est clairement une partie de la conception que le get-méthodes d'extraire des données sans conversion et les méthodes d'effectuer des conversions d'une certaine sorte.
Supprimer des Heures, puis obtenir des minutes
long hours = attendanceDuration.toHours();
long minutes = attendanceDuration.minusHours(hours).toMinutes();
Par-dessous le code que j'ai obtenu cette durée de sortie:
exemple de code:
Explication:
En utilisant la Durée de l'interface, vous pouvez facilement trouver l'expression exacte de l'affichage que vous souhaitez.
vous avez juste besoin de réduire le plus TemporalUnit de la durée actuelle.
par exemple:
etc... jusqu'à ce que u obtenir duration = 0