миллисекунды в дни - PullRequest
       24

миллисекунды в дни

42 голосов
/ 20 октября 2011

Я провел некоторые исследования, но все еще не могу найти, как получить дни ... Вот что я получил:

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
int days = ????? ;

Пожалуйста, помогите, я сосу математику, спасибо.

Ответы [ 5 ]

119 голосов
/ 20 октября 2011

Для таких простых случаев, как этот, следует использовать TimeUnit .Использование TimeUnit немного более ясно о том, что представляется, и также намного легче читать и писать по сравнению с выполнением всех арифметических вычислений явно.Например, чтобы вычислить количество дней из миллисекунд, будет работать следующий оператор:

    long days = TimeUnit.MILLISECONDS.toDays(milliseconds);

Для более сложных случаев, когда необходимо представить более мелкие длительности в контексте работы со временем,Следует использовать всеобъемлющий и современный API даты / времени.Для JDK8 + теперь включен java.time (вот учебники и javadocs ).Для более ранних версий Java joda-time является надежной альтернативой.

88 голосов
/ 20 октября 2011

Если у вас нет другого временного интервала, превышающего дни:

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 голосов
/ 20 октября 2011
int days = (int) (milliseconds / 86 400 000 )
1 голос
/ 06 января 2016
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 .

0 голосов
/ 11 января 2019

Если вы решаете более сложную задачу регистрации статистики выполнения в вашем коде:

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 (), если хотите.

...