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.
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.
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);
Si sur Android, je suggère:
DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS
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);
où 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.
Le Java TimeUnit semble être ce que vous voulez
Joda Time a aussi une classe DateTimeConstants
avec des choses comme MILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY, etc., etc.
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.
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.
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
.
Une autre approche avec des instances Duration
déjà cuites (pour plusieurs appels) (et 0 opérations mathématiques):
ChronoUnit.DAYS.getDuration().getSeconds()
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()
.
J'en doute, car ce ne sont pas toutes des constantes. Le nombre de millisecondes par an varie, non?
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.
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