Время запоров на Яве?
есть ли пакет Java со всеми раздражающими константами времени, такими как миллисекунды / секунды / минуты в минуту / час / день / год? Я бы не хотел дублировать что-то подобное.
12 ответов:
Joda-Time классы, такие как дней, которые содержат такие методы, как toStandardSeconds(). Так что вы можете написать:
int seconds = Days.ONE.toStandardSeconds();
хотя это кажется немного громоздким, и может быть полезен только для более сложных сценариев, таких как високосные годы и т. д.
Я бы пошел с java TimeUnit если вы не включаете joda-time в свой проект уже. Вам не нужно включать внешний lib, и это довольно просто.
всякий раз, когда вам нужны эти "раздражающие константы", вы обычно нуждаетесь в них, чтобы mutliply какое-то число для преобразования кросс-единицы. Вместо этого вы можете использовать TimeUnit для простого преобразования значений без явного умножения.
это:
long milis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;
будет это:
long milis = TimeUnit.HOURS.toMillis(hours);
если вы предоставляете метод, который принимает некоторое значение, скажем, в millis, а затем нужно преобразовать его, лучше следовать тому, что делает Java concurrency API:
public void yourFancyMethod(long somePeriod, TimeUnit unit) { int iNeedSeconds = unit.toSeconds(somePeriod); }
Если вам действительно нужны константы очень плохо вы все еще можете получить т. е. секунд в час, позвонив:
int secondsInHour = TimeUnit.HOURS.toSeconds(1);
Если на android, я предлагаю:
android.текст.формат.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
Java 8 / java.время решения
в качестве альтернативы
TimeUnit
, вы можете по какой-то причине предпочесть продолжительность класс java.время пакет:Duration.ofDays(1).getSeconds() // returns 86400; Duration.ofMinutes(1).getSeconds(); // 60 Duration.ofHours(1).toMinutes(); // also 60 //etc.
кроме того, если бы вы пошли глубже и проанализировали, как продолжительность.дней(..) метод работает, вы увидите следующий код:
return create(Math.multiplyExact(days, SECONDS_PER_DAY), 0);
здесь
SECONDS_PER_DAY
- это пакет, защищенные статические константы с местное время класс./** * 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.
Я думаю, что можно с уверенностью предположить, что если бы был какой-либо пакет, который определил бы "все раздражающие постоянные времени, такие как милисекунды/секунды/минуты", как вы их называете, я считаю, что разработчики Java SDK будут использовать их.
почему это
LocalTime
константы пакет защищен и не является публичным, что является хорошим вопросом, я считаю, что есть причина для этого. На данный момент похоже, что вам действительно нужно скопировать их и поддерживать самостоятельно.
Java TimeUnit Кажется, что вы хотите
время Джоды также имеет
DateTimeConstants
класс с такими вещами, как MILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY и т. д.
пока
TimeUnit
обсуждали в ответ иDuration
обсуждали в ответ вероятно, более непосредственно обращается к вопросу, есть некоторые другие удобные функции единиц времени в Java.java.время
The java.пакет времени сложные перечисления на
DayOfWeek
иMonth
. Поэтому вместо того, чтобы передавать простое число или строку, вы можете передавать полноценные объекты, такие как какDayOfWeek.TUESDAY
илиMonth.FEBRUARY
.java.временные рамки также включают в себя такие классы, как
MonthDay
,YearMonth
иYear
. Опять же, вы можете передавать полноценные объекты, а не просто числа или строки, чтобы сделать ваш код более самодокументированным, обеспечить допустимые значения и обеспечить безопасность типов.ThreeTen-дополнительный проект
The ThreeTen-Extra проект предоставляет дополнительные классы для работы с java.время. К ним относятся:
DayOfMonth
,DayOfYear
,AmPm
,Quarter
,YearQuarter
,YearWeek
,Days
,Weeks
,Months
,Years
иInterval
.
еще один подход с уже испеченным (для нескольких вызовов)
Duration
экземпляры (и 0 математических операций):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.
создать их самостоятельно, я думаю, проще всего. Вы можете использовать
Date
иCalendar
классы для выполнения вычислений со временем и датами. Используйтеlong
тип данных для работы с большими числами, такими как миллисекунды с 1 января 1970 UTC,System.currentTimeMillis()
.
Я сомневаюсь в этом, потому что они не все константы. Количество миллисекунд в течение года меняется, не так ли?