Время запоров на Яве?


есть ли пакет Java со всеми раздражающими константами времени, такими как миллисекунды / секунды / минуты в минуту / час / день / год? Я бы не хотел дублировать что-то подобное.

12 51

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().

Я сомневаюсь в этом, потому что они не все константы. Количество миллисекунд в течение года меняется, не так ли?

если вы хотите получить значения Calendar есть все поля, связанные с управлением временем, с некоторым простым отражением вы можете сделать

вот что я использую для получения миллисекунд.

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK