web-dev-qa-db-fra.com

Arrondir les minutes au plafond en utilisant Java 8

J'ai donc la chance d'utiliser Java 8 et la nouvelle heure APi mais je ne vois aucune fonction d'arrondi ...

Fondamentalement, si le temps est ...

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000

Cela semble être correct, mais est-ce vrai?

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1);

System.out.println(newTime.toString());
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000")));
32
user432024

Le Java.time L'API ne prend pas en charge l'arrondi au plafond, mais elle prend en charge arrondi au sol (troncature) qui permet le comportement souhaité (qui n'est pas exactement arrondi au plafond):

LocalDateTime now =  LocalDateTime.now();
LocalDateTime roundFloor =  now.truncatedTo(ChronoUnit.MINUTES);
LocalDateTime roundCeiling =  now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1);

De plus, il est possible d'obtenir une horloge qui ne fait tic-tac qu'une fois par minute, ce qui peut être intéressant:

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault());
LocalDateTime now =  LocalDateTime.now(minuteTickingClock);
LocalDateTime roundCeiling =  now.plusMinutes(1);

Cette horloge tronquera automatiquement les minutes au sol (bien qu'elle soit spécifiée de sorte qu'elle puisse retourner une valeur mise en cache différée). Notez qu'un Clock peut être stocké dans une variable statique si vous le souhaitez.

Enfin, s'il s'agit d'une opération courante que vous souhaitez utiliser à plusieurs endroits, il est possible d'écrire une fonction de bibliothèque TemporalAdjuster pour effectuer l'arrondi. (Les ajusteurs peuvent être écrits une seule fois, testés et mis à disposition en tant que variable ou méthode statique).

51
JodaStephen
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);

Cela arrondira à la minute la plus proche, agissant comme une fonction plafond avec les minutes comme partie entière.

2
Sean Van Gorder

Java.time (la nouvelle API temporelle de Java 8) a pas de fonction d'arrondi comme certaines autres bibliothèques. Vous essayez d'utiliser la mise en forme pour arrondir au niveau de la chaîne. Si vous vous voulez cependant arrondir les objets temporels, vous pouvez effectuer cet arrondi manuellement:

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).withSecond(0).withNano(0);

Au fait, vous vouliez sûrement parler de plancher, pas de plafond, n'est-ce pas?

Mise à jour:

J'ai trouvé cette façon légèrement meilleure de régler au sol (évidemment la seule caractéristique d'arrondi, le plafond n'est pas pris en charge):

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);
1
Meno Hochschild