web-dev-qa-db-fra.com

millisecondes à jours

j'ai fait des recherches, mais je ne trouve toujours pas comment obtenir les jours ...

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

S'il vous plaît, aidez-moi, je suis nul en maths, merci.

41
Reacen

Si vous n'avez pas d'autre intervalle de temps supérieur à jours:

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

Si vous avez aussi des semaines:

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

Il est probablement préférable d'éviter d'utiliser des mois et des années si possible, car ils n'ont pas de longueur fixe bien définie. À proprement parler, ni les jours: l’heure avancée signifie que les journées peuvent avoir une durée qui n’est pas de 24 heures.

84
Mark Byers

Pour les cas simples comme celui-ci, TimeUnit doit être utilisé. L'utilisation de TimeUnit est un peu plus explicite sur ce qui est représenté et est également beaucoup plus facile à lire et à écrire par rapport à la réalisation explicite de tous les calculs arithmétiques. Par exemple, pour calculer le nombre de jours à partir de millisecondes, l'instruction suivante fonctionnerait:

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

Pour les cas plus avancés, où des durées plus fines doivent être représentées dans le contexte du travail dans le temps, une API de date/heure complète et moderne devrait être utilisée. Pour JDK8 +, Java.time est maintenant inclus (voici les tutorials et javadocs ). Pour les versions antérieures de Java, joda-time est une alternative solide.

114
whaley
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;

Vous pouvez lancer int mais je vous recommande d’utiliser long .

1
Codeversed
int days = (int) (milliseconds / 86 400 000 )
1
Kurtis Nusbaum

Si vous résolvez une tâche plus complexe de journalisation des statistiques d’exécution dans votre code:

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 peut être remplacé par un simple System.out.println () si vous le souhaitez.

0
Zon