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.
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.
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);
Wenn auf Android, empfehle ich:
DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS
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.
Die Java TimeUnit scheint das zu sein, was Sie wollen
Joda Time hat auch eine DateTimeConstants
Klasse mit Dingen wie MILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY usw.
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.
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.
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
.
Ein weiterer Ansatz mit bereits gebackenen (für mehrere Aufrufe) Duration
-Instanzen (und 0 mathematischen Operationen):
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.
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()
.
Ich bezweifle es, weil sie nicht alle Konstanten sind. Die Anzahl der Millisekunden für ein Jahr variiert, oder?
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 ..
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