92 votes

Constantes de temps en Java ?

Existe-t-il un paquet Java contenant toutes les constantes de temps ennuyeuses telles que millisecondes/secondes/minutes dans une minute/heure/jour/année ? Je n'aimerais pas avoir à dupliquer quelque chose comme ça.

150voto

theadam Points 787

J'opterais pour java Unité de temps si vous n'incluez pas déjà joda-time dans votre projet. Vous n'avez pas besoin d'inclure une librairie externe et c'est assez simple.

Lorsque vous avez besoin de ces "constantes gênantes", c'est généralement pour multiplier un nombre afin de le convertir en unités. Au lieu de cela, vous pouvez utiliser TimeUnit pour convertir simplement les valeurs sans multiplication explicite.

Ceci :

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

devient ceci :

long millis = TimeUnit.HOURS.toMillis(hours);

Si vous exposez une méthode qui accepte une valeur en millis, par exemple, et que vous devez ensuite la convertir, il est préférable de suivre ce que fait l'API de concurrence Java :

public void yourFancyMethod(long somePeriod, TimeUnit unit) {
    int iNeedSeconds = unit.toSeconds(somePeriod);
}

Si vous avez vraiment besoin de ces constantes, vous pouvez toujours obtenir, par exemple, les secondes d'une heure en appelant :

int secondsInHour = TimeUnit.HOURS.toSeconds(1);

39voto

Mateusz Szulc Points 339

Solution Java 8 / java.time

En lieu et place de TimeUnit il se peut que, pour une raison ou une autre, vous préfériez l'option Durée de l'accord de la classe java.time l'emballage :

Duration.ofDays(1).getSeconds()     // returns 86400;
Duration.ofMinutes(1).getSeconds(); // 60
Duration.ofHours(1).toMinutes();    // also 60
//etc.

En outre, si vous alliez plus loin et analysiez le fonctionnement de la méthode Duration.ofDays(..), vous verriez le code suivant :

return create(Math.multiplyExact(days, SECONDS_PER_DAY), 0);

donde SECONDS_PER_DAY est une constante statique protégée par un paquet de Heure locale classe.

/**
 * Seconds per day.
 */
static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;

//there are also many others, like HOURS_PER_DAY, MINUTES_PER_HOUR, etc.

Je pense que l'on peut supposer que s'il existait un paquet définissant "toutes les constantes de temps ennuyeuses comme les milisecondes/secondes/minutes", comme vous les appelez, je pense que les développeurs du SDK Java l'auraient utilisé.

Pourquoi cette LocalTime Le fait que les constantes soient protégées et non publiques est une bonne question, je pense qu'il y a une raison à cela. Pour l'instant, il semble que vous deviez vraiment les copier et les maintenir par vous-même.

36voto

Oded Breiner Points 1852

Si vous êtes sur Android, je vous suggère :

Android.text.format.DateUtils

DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS

28voto

Brian Agnew Points 143181

Joda-Time contient des classes telles que Jours qui contiennent des méthodes telles que [toStandardSeconds()](http://www.joda.org/joda-time/apidocs/org/joda/time/Hours.html#toStandardSeconds()) . Vous pouvez donc écrire :

int seconds = Days.ONE.toStandardSeconds();

bien qu'il semble un peu verbeux et qu'il ne soit peut-être utile que pour des scénarios plus complexes tels que les années bissextiles, etc.

15voto

Martin Points 4844

La Java Unité de temps semble correspondre à ce que vous souhaitez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X