Миллисекунды до дней
Я провел некоторое исследование, но до сих пор не могу найти, как получить дни... Вот что я получил:
int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours = (int) ((milliseconds / (1000*60*60)) % 24);
int days = ????? ;
Пожалуйста, помогите, я сосать математику, спасибо.
Ответы
Ответ 1
Если у вас нет другого интервала времени больше, чем дней:
int days = (int) (milliseconds / (1000*60*60*24));
Если у вас тоже есть недели:
int days = (int) ((milliseconds / (1000*60*60*24)) % 7);
int weeks = (int) (milliseconds / (1000*60*60*24*7));
Вероятно, лучше избегать использования месяцев и лет, если это возможно, поскольку они не имеют четко определенной фиксированной длины. Строго говоря, не делайте дней: переход на летнее время означает, что дни могут иметь длину, не равную 24 часам.
Ответ 2
Для простых случаев, подобных этому, следует использовать TimeUnit. Использование TimeUnit является более явным в отношении того, что представляется, а также гораздо легче читать и писать по сравнению с выполнением всех арифметических вычислений явно. Например, чтобы вычислить число дней с миллисекунд, будет работать следующий оператор:
long days = TimeUnit.MILLISECONDS.toDays(milliseconds);
Для случаев более продвинутых, где более мелкозернистые длительности необходимо представлять в контексте работы со временем, следует использовать все охватывающие и современные API даты/времени. Для JDK8 + теперь включено java.time(здесь учебники и javadocs). Для более ранних версий Java joda-time это надежная альтернатива.
Ответ 3
int days = (int) (milliseconds / 86 400 000 )
Ответ 4
public static final long SECOND_IN_MILLIS = 1000;
public static final long MINUTE_IN_MILLIS = SECOND_IN_MILLIS * 60;
public static final long HOUR_IN_MILLIS = MINUTE_IN_MILLIS * 60;
public static final long DAY_IN_MILLIS = HOUR_IN_MILLIS * 24;
public static final long WEEK_IN_MILLIS = DAY_IN_MILLIS * 7;
Вы можете использовать int, но я бы рекомендовал использовать long.
Ответ 5
В случае, если вы решаете более сложную задачу регистрации статистики выполнения в вашем коде:
public void logExecutionMillis(LocalDateTime start, String callerMethodName) {
LocalDateTime end = getNow();
long difference = Duration.between(start, end).toMillis();
Logger logger = LoggerFactory.getLogger(ProfilerInterceptor.class);
long millisInDay = 1000 * 60 * 60 * 24;
long millisInHour = 1000 * 60 * 60;
long millisInMinute = 1000 * 60;
long millisInSecond = 1000;
long days = difference / millisInDay;
long daysDivisionResidueMillis = difference - days * millisInDay;
long hours = daysDivisionResidueMillis / millisInHour;
long hoursDivisionResidueMillis = daysDivisionResidueMillis - hours * millisInHour;
long minutes = hoursDivisionResidueMillis / millisInMinute;
long minutesDivisionResidueMillis = hoursDivisionResidueMillis - minutes * millisInMinute;
long seconds = minutesDivisionResidueMillis / millisInSecond;
long secondsDivisionResidueMillis = minutesDivisionResidueMillis - seconds * millisInSecond;
logger.info(
"\n************************************************************************\n"
+ callerMethodName
+ "() - "
+ difference
+ " millis ("
+ days
+ " d. "
+ hours
+ " h. "
+ minutes
+ " min. "
+ seconds
+ " sec."
+ secondsDivisionResidueMillis
+ " millis).");
}
PS Logger может быть заменен простым System.out.println(), если хотите.