Время в Java не работает? - PullRequest
61 голосов
/ 14 марта 2010

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

Ответы [ 12 ]

112 голосов
/ 06 марта 2013

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

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

Это:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

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

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

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

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

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

int secondsInHour = TimeUnit.HOURS.toSeconds(1);
33 голосов
/ 30 марта 2014

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

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
27 голосов
/ 01 февраля 2016

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

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

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

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

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

22 голосов
/ 14 марта 2010

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

int seconds = Days.ONE.toStandardSeconds();

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

13 голосов
/ 14 марта 2010

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

11 голосов
/ 10 октября 2013

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

2 голосов
/ 18 июля 2017

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

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK
2 голосов
/ 31 июля 2014

В то время как TimeUnit обсуждается в этом ответе и Duration обсуждается в этом ответе , вероятно, более непосредственное отношение к Вопросу, однако в Java.

java.time

В пакете 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.

1 голос
/ 23 ноября 2017

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

ChronoUnit.DAYS.getDuration().getSeconds()
0 голосов
/ 14 марта 2010

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

Field [] 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 и т. Д.

...