Подтвердить что ты не робот

Время consts в Java?

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

4b9b3361

Ответ 1

Joda-Time содержит классы, такие как Days, которые содержат такие методы, как toStandardSeconds(). Поэтому вы можете написать:

int seconds = Days.ONE.toStandardSeconds();

хотя это кажется немного подробным и, возможно, полезно только для более сложных сценариев, таких как високосные годы и т.д.

Ответ 2

Я бы добавил java TimeUnit, если вы уже не включаете joda-time в свой проект. Вам не нужно включать внешнюю библиотеку, и это довольно просто.

Всякий раз, когда вам нужны эти "раздражающие константы", вы обычно нуждаетесь в их умножении на некоторое число для преобразования между единицами. Вместо этого вы можете использовать TimeUnit для простого преобразования значений без явного умножения.

Это:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

становится таким:

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

Если вы предоставляете метод, который принимает какое-либо значение, скажем, в millis, а затем необходимо преобразовать его, лучше следовать тому, что делает API параллелизма Java:

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

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

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

Ответ 3

Если на андроиде я предлагаю:

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

Ответ 4

Java 8/java.time решение

В качестве альтернативы TimeUnit вы можете по какой-то причине предпочесть класс Duration из пакета java.time:

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

Кроме того, если вы пойдете глубже и проанализируете, как работает метод Duration.ofDays(..), вы увидите следующий код:

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

где SECONDS_PER_DAY - статическая константа, защищенная пакетом, из класса LocalTime.

/**
 * 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.

Я думаю, что можно с уверенностью предположить, что если будет какой-то пакет, который определил бы "все раздражающие постоянные времени, такие как miliseconds/seconds/minutes", как вы их называете, я считаю, что разработчики Java SDK использовали бы их.

Почему этот пакет констант LocalTime защищен и не является общедоступным, это хороший вопрос, я считаю, что для этого есть причина. На данный момент похоже, что вам действительно нужно скопировать их и поддерживать самостоятельно.

Ответ 5

Java TimeUnit кажется тем, что вы хотите

Ответ 6

Joda Time также имеет класс DateTimeConstants с такими вещами, как MILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY и т.д. и т.д.

Ответ 7

Хотя TimeUnit обсуждается в этом ответе и Duration обсуждается в этом ответе, возможно, более непосредственно касается вопроса, в Java есть некоторые другие удобные функции единиц времени.

java.time

Для юнитов см. ChronoUnit enum:

  • FOREVER
  • ERAS
  • MILLENNIA
  • CENTURIES
  • DECADES
  • YEARS
  • MONTHS
  • WEEKS
  • DAYS
  • HALF_DAYS
  • HOURS
  • MINUTES
  • SECONDS
  • MILLIS
  • MICROS
  • NANOS

пакет java.time содержит сложные перечисления для DayOfWeek и Month. Поэтому вместо передачи простого числа или строки вы можете передавать полноценные объекты, такие как DayOfWeek.TUESDAY или Month.FEBRUARY.

Среда java.time также включает классы, такие как MonthDay, YearMonth и Year. Опять же, вы можете передавать полноценные объекты, а не просто числа или строки, чтобы сделать ваш код более самодокументированным, обеспечить допустимые значения и обеспечить безопасность типов.

Проект ThreeTen-Extra

Проект ThreeTen-Extra предоставляет дополнительные классы для работы с java.time. К ним относятся: DayOfMonth, DayOfYear, AmPm, Quarter, YearQuarter, YearWeek, Days, Weeks, Months, Years и Interval.

Ответ 8

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

import javax.management.timer.Timer;

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

Ответ 9

Еще один подход с уже испеченным (для множественного вызова) Duration экземплярами (и 0 математическими операциями):

ChronoUnit.DAYS.getDuration().getSeconds()

Ответ 10

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

Ответ 11

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

Ответ 12

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

Поле [] fields = Calendar.class.getFields();

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

это выведет:

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

из которого вы можете исключить то, что вам не нужно.

Если вам нужны только константы, вы их: Calendar.DAY_OF_MONTH, Calendar.YEAR и т.д.

Ответ 13

Если константы будут использоваться как константы времени компиляции (например, как атрибут в аннотации), тогда пригодится Apache DateUtils.

import org.apache.commons.lang.time.DateUtils;
DateUtils.MILLIS_PER_SECOND
DateUtils.MILLIS_PER_MINUTE
DateUtils.MILLIS_PER_HOUR
DateUtils.MILLIS_PER_DAY

Это примитивные длинные константы.