web-dev-qa-db-fra.com

Constante de temps en Java?

Existe-t-il un package Java contenant toutes les constantes de temps gênantes telles que Millisecondes/secondes/minutes en minutes/heures/jours/années? Je détesterais dupliquer quelque chose comme ça.

56
Yossale

Joda-Time contient des classes telles que Days , qui contiennent des méthodes telles que toStandardSeconds () . Pour que vous puissiez écrire:

int seconds = Days.ONE.toStandardSeconds();

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

22
Brian Agnew

J'irais avec Java TimeUnit si vous n'incluez pas déjà joda-time dans votre projet. Vous n'avez pas besoin d'inclure une bibliothèque externe et c'est assez simple.

Chaque fois que vous avez besoin de ces "constantes gênantes", vous en avez généralement besoin pour multiplier un nombre lors de la conversion entre unités. À la place, vous pouvez utiliser TimeUnit pour convertir simplement les valeurs sans multiplication explicite.

Ce:

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, par exemple, millis et que vous devez ensuite 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 des constantes, vous pouvez toujours obtenir i.e. secondes en une heure en appelant:

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

Si sur Android, je 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
31
Oded Breiner

Solution Java 8/Java.time

Au lieu de TimeUnit, pour une raison quelconque, vous pourriez préférer le package Duration class from Java.time:

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

De plus, si vous vouliez approfondir et analyser le fonctionnement de la méthode Duration.ofDays (..), vous verriez le code suivant:

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

SECONDS_PER_DAY est une constante statique protégée par un paquet de LocalTime class.

/**
 * 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 qu'il est prudent de supposer que s'il existait un package définissant "toutes les constantes de temps agaçantes telles que miliseconds/seconds/minutes" comme vous les appelez, je pense que les développeurs Java SDK les utiliseraient.

Pourquoi ce paquetage LocalTime constantes est-il protégé et non public? C’est une bonne question. Je pense qu’il ya une raison à cela. Pour l'instant, il semble que vous deviez vraiment les copier et les entretenir vous-même.

23
Mateusz Szulc

Le Java TimeUnit semble être ce que vous voulez

13
Martin

Joda Time a aussi une classe DateTimeConstants avec des choses comme MILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY, etc., etc.

10
Lindsay Thurmond

Alors que TimeUnit a été discuté dans cette réponse et Duration a été discuté dans cette réponse traite probablement plus directement de la question, il existe d’autres fonctionnalités pratiques en unités de temps en Java.

Java.time

Le package Java.time a des énumérations sophistiquées pour DayOfWeek et Month . Ainsi, plutôt que de contourner un simple nombre ou une chaîne, vous pouvez transmettre des objets à part entière tels que DayOfWeek.TUESDAY ou Month.FEBRUARY

Le framework Java.time inclut également des classes telles que MonthDay, YearMonth et Year. Là encore, vous pouvez transmettre des objets complets plutôt que de simples nombres ou des chaînes pour rendre votre code plus auto-documenté, garantir des valeurs valides et assurer la sécurité du type.

Projet ThreeTen-Extra

Le projet ThreeTen-Extra fournit des classes supplémentaires pour travailler avec Java.time. Ceux-ci comprennent: DayOfMonth, DayOfYear, AmPm, Quarter, YearQuarter, YearWeek, Days, Weeks, Months, Years et Interval.

2
Basil Bourque

Une autre approche avec des instances Duration déjà cuites (pour plusieurs appels) (et 0 opérations mathématiques):

ChronoUnit.DAYS.getDuration().getSeconds()
1
Vladislav Denisko
              60 * 1000 miliseconds in 1 minute
                     60     seconds in 1 minute
                      1      minute in 1 minute
                   1/60       hours in 1 minute
              1/(60*24)        days in 1 minute
          1/(60*24*365)       years in 1 minute
1/(60*24*(365 * 4 + 1))     4 years in 1 minute
                                                * 60            is in 1 hour
                                                * 60 * 24       is in 1 day
                                                * 60 * 24 * 365 is in 1 year
                                            etc.

Je suppose que les créer vous-même est le plus facile. Vous pouvez utiliser les classes Date et Calendar pour effectuer des calculs avec une heure et des dates. Utilisez le type de données long pour travailler avec de grands nombres, tels que miliseconds à partir du 1 janvier 1970 UTC, System.currentTimeMillis().

0
Pindatjuh

J'en doute, car ce ne sont pas toutes des constantes. Le nombre de millisecondes par an varie, non? 

0
duffymo

Si vous voulez obtenir les valeurs Calendar avoir tous les champs liés à la gestion du temps, avec une réflexion simple, vous pouvez faire

Field [] fields = Calendar.class.getFields ();

for (Field f : fields)
{
  String fName = f.toString();
  System.out.println(fName.substring(fName.lastIndexOf('.')+1).replace("_", " ").toLowerCase());
}

ceci produira:

era
year
month
week of year
week of month
date
day of month
day of year
day of week
day of week in month
am pm
hour
hour of day
minute
second
millisecond
zone offset
dst offset
field count
sunday
monday
tuesday
wednesday
thursday
friday
saturday
january
february
march
april
may
june
july
august
september
october
november
december
undecimber
am
pm
all styles
short
long

à partir duquel vous pouvez exclure ce dont vous n’avez pas besoin.

Si vous avez juste besoin de constantes, vous les avez: Calendar.DAY_OF_MONTH, Calendar.YEAR et ainsi de suite.

0
Jack

Voici ce que j'utilise pour obtenir des millisecondes. 

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK
0
Reaz Murshed