java.time
The Answer by Habsq a la bonne idée mais les mauvaises méthodes.
Pour un intervalle de temps indépendant de la chronologie à l'échelle des années-mois-jours, utilisez Period
. Pour les jours signifiant des tranches de 24 heures sans rapport avec le calendrier et les heures-minutes-secondes, utilisez Duration
. Mélanger les deux échelles n'a guère de sens.
Duration
Commencez par récupérer le moment actuel comme vu en UTC , en utilisant la Instant
classe.
Instant now = Instant.now(); // Capture the current moment as seen in UTC.
Instant then = now.minus( 8L , ChronoUnit.HOURS ).minus( 8L , ChronoUnit.MINUTES ).minus( 8L , ChronoUnit.SECONDS );
Duration d = Duration.between( then , now );
Générez du texte pendant des heures, des minutes et des secondes.
// Generate text by calling `to…Part` methods.
String output = d.toHoursPart() + " hours ago\n" + d.toMinutesPart() + " minutes ago\n" + d.toSecondsPart() + " seconds ago";
Dump dans la console.
System.out.println( "From: " + then + " to: " + now );
System.out.println( output );
Du: 2019-06-04T11: 53: 55.714965Z au: 2019-06-04T20: 02: 03.714965Z
il y a 8 heures
Il y a 8 minutes
Il y a 8 secondes
Period
Commencez par obtenir la date actuelle.
Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde entier par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu'il est encore «hier» à Montréal Québec .
Si aucun fuseau horaire n'est spécifié, la machine virtuelle Java applique implicitement son fuseau horaire par défaut actuel. Cette valeur par défaut peut changer à tout moment pendant l'exécution (!), Donc vos résultats peuvent varier. Mieux vaut spécifier explicitement votre fuseau horaire souhaité / attendu comme argument. Si critique, confirmez la zone avec votre utilisateur.
Indiquez un nom de fuseau horaire approprié dans le format Continent/Region
, tels que America/Montreal
, Africa/Casablanca
ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 2 à 4 lettres telle que EST
ou IST
car ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Recréez une date il y a huit jours, des mois et des années.
LocalDate then = today.minusYears( 8 ).minusMonths( 8 ).minusDays( 7 ); // Notice the 7 days, not 8, because of granularity of months.
Calculez le temps écoulé.
Period p = Period.between( then , today );
Construisez la chaîne de pièces "il y a du temps".
String output = p.getDays() + " days ago\n" + p.getMonths() + " months ago\n" + p.getYears() + " years ago";
Dump dans la console.
System.out.println( "From: " + then + " to: " + today );
System.out.println( output );
Du: 2010-09-27 au: 2019-06-04
Il y a 8 jours
il y a 8 mois
il y a 8 ans
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date
, Calendar
, et SimpleDateFormat
.
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*
classes.
Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .