Pergunta

Eu fiz alguma pesquisa, mas ainda não conseguiu encontrar como obter os dias ... Aqui está o que eu tenho:

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

Por favor, ajuda, eu chupar em matemática, obrigado de.

Foi útil?

Solução

Se você não tiver um outro intervalo de tempo maior do que dias:

int days = (int) (milliseconds / (1000*60*60*24));

Se você tiver semanas demasiado:

int days = (int) ((milliseconds / (1000*60*60*24)) % 7);
int weeks = (int) (milliseconds / (1000*60*60*24*7));

É provavelmente o melhor evitar o uso de meses e anos, se possível, como eles não têm um comprimento fixo bem definido. Estritamente falando nem dias: economia de meios que os dias pode ter um comprimento que não é de 24 horas luz do dia

.

Outras dicas

Para casos simples como este, TimeUnit deve ser usava. uso TimeUnit é um pouco mais explícito sobre o que está sendo representado e também é muito mais fácil de ler e escrever quando comparado a fazer todos os cálculos aritméticos explicitamente. Por exemplo, para calcular o número de dias de milissegundos, a seguinte declaração iria funcionar:

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

Para casos mais avançados, onde durações mais de textura fina precisam ser representados no contexto de trabalhar com o tempo, uma abrangente e moderna API toda data / hora deve ser usado. Para JDK8 +, java.time agora está incluído (aqui estão os tutoriais e javadocs ). Para versões anteriores do Java joda-time é uma alternativa sólida.

int days = (int) (milliseconds / 86 400 000 )
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;

Você poderia lançar int , mas eu recomendo usar longo .

No caso de você resolver uma tarefa mais complexa de estatísticas de execução de registro em seu código:

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).");
}

P.S. Logger pode ser substituída por simples System.out.println () se você gosta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top