wake-up-neo.net

Zeitkonstante in Java?

Gibt es ein Java-Paket mit all den störenden Zeitkonstanten wie Millisekunden/Sekunden/Minuten in einer Minute/Stunde/Tag/Jahr? Ich würde es hassen, so etwas zu kopieren.

56
Yossale

Joda-Time enthält Klassen wie Days , die Methoden wie toStandardSeconds () enthalten. So können Sie schreiben:

int seconds = Days.ONE.toStandardSeconds();

obwohl es ein wenig ausführlich erscheint und vielleicht nur für komplexere Szenarien wie Schaltjahre usw. nützlich ist.

22
Brian Agnew

Ich würde mit Java TimeUnit gehen, wenn Sie joda-time nicht bereits in Ihr Projekt aufnehmen. Sie müssen keine externe lib hinzufügen und sie ist ziemlich unkompliziert.

Wann immer Sie diese "störenden Konstanten" benötigen, benötigen Sie normalerweise mehrere Zahlen, um die Einheiten zu konvertieren. Stattdessen können Sie TimeUnit verwenden, um die Werte ohne explizite Multiplikation zu konvertieren.

Diese:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

wird dies:

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

Wenn Sie eine Methode verfügbar machen, die beispielsweise einen Wert in Millis akzeptiert, und sie dann konvertieren müssen, sollten Sie besser nachvollziehen, was die Java Concurrency API tut:

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

Wenn Sie die Konstanten wirklich dringend benötigen, können Sie immer noch Sekunden in einer Stunde erhalten, indem Sie Folgendes anrufen:

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

Wenn auf Android, empfehle ich:

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

Java 8/Java.time-Lösung

Als Alternative zu TimeUnit können Sie aus irgendeinem Grund die Duration -Klasse aus dem Java.time -Paket bevorzugen:

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

Wenn Sie tiefer gehen und analysiert hätten, wie die Duration.ofDays (..) -Methode funktioniert, wird der folgende Code angezeigt:

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

dabei ist SECONDS_PER_DAY eine paketgeschützte statische Konstante aus 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.

Ich denke, es ist sicher anzunehmen, dass wenn es ein Paket geben würde, das "alle nervigen Zeitkonstanten wie Milisekunden/Sekunden/Minuten" definiert, wie Sie sie nennen, ich glaube, dass Java SDK-Entwickler sie verwenden würden.

Warum ist dieses LocalTime-Konstantenpaket geschützt und nicht öffentlich, das ist eine gute Frage? Ich glaube, dass es einen Grund dafür gibt. Im Moment sieht es so aus, als müssten Sie sie wirklich kopieren und selbst pflegen.

23
Mateusz Szulc

Die Java TimeUnit scheint das zu sein, was Sie wollen

13
Martin

Joda Time hat auch eine DateTimeConstants Klasse mit Dingen wie MILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY usw.

10

Während TimeUnit in diese Antwort und Duration in diese Antwort die Frage wahrscheinlich direkter anspricht, geht es doch um ein paar andere praktische Zeiteinheiten in Java.

Java.time

Das Java.time-Paket hat anspruchsvolle Enumerationen für DayOfWeek und Month . Anstatt nur eine Zahl oder einen String zu übergeben, können Sie auch vollwertige Objekte wie DayOfWeek.TUESDAY oder Month.FEBRUARY übergeben. 

Das Java.time-Framework enthält auch Klassen wie MonthDay, YearMonth und Year. Sie können wiederum vollwertige Objekte anstelle von Zahlen oder Strings übergeben, um Ihren Code mehr selbstdokumentierend zu machen, gültige Werte zu gewährleisten und die Typsicherheit zu gewährleisten.

ThreeTen-Extra-Projekt

Das Projekt ThreeTen-Extra bietet zusätzliche Klassen für die Arbeit mit Java.time. Dazu gehören: DayOfMonth, DayOfYear, AmPm, Quarter, YearQuarter, YearWeek, Days, Weeks, Months, Years und Interval.

2
Basil Bourque

Ein weiterer Ansatz mit bereits gebackenen (für mehrere Aufrufe) Duration-Instanzen (und 0 mathematischen Operationen):

ChronoUnit.DAYS.getDuration().getSeconds()
1
              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.

Schaffe sie selbst, denke ich, ist am einfachsten. Sie können die Klassen Date und Calendar verwenden, um Berechnungen mit Zeit und Datum durchzuführen. Verwenden Sie den Datentyp long, um mit großen Zahlen zu arbeiten, z. B. Millisekunden ab 1. Januar 1970, UTC, System.currentTimeMillis().

0
Pindatjuh

Ich bezweifle es, weil sie nicht alle Konstanten sind. Die Anzahl der Millisekunden für ein Jahr variiert, oder? 

0
duffymo

Wenn Sie die Werte beziehen möchten, die Calendar alle Felder für die Zeitverwaltung enthalten, können Sie dies mit ein paar einfachen Überlegungen tun

Feld [] Felder = Calendar.class.getFields ();

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

dies wird ausgegeben:

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

von denen Sie ausschließen können, was Sie nicht brauchen.

Wenn Sie nur Konstanten benötigen, haben Sie diese: Calendar.DAY_OF_MONTH, Calendar.YEAR und so weiter ..

0
Jack

Hier ist was ich brauche um Millisekunden zu bekommen. 

import javax.management.timer.Timer;

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