Tester si l’horodatage Unix est aujourd’hui en Java 7

Je dois vérifier si un horodatage Unix (stocké en tant que long ) représente aujourd’hui (dans mon fuseau horaire). C’est là que je suis, mais cela ne semble pas très élégant:

 Calendar tokenTimestamp = Calendar.getInstance(); tokenTimestamp.setTimeInMillis(foo.getDateTimeCreated()); Calendar now = Calendar.getInstance(); if (tokenTimestamp.get(Calendar.DAY_OF_MONTH) != now.get(Calendar.DAY_OF_MONTH) || tokenTimestamp.get(Calendar.MONTH) != now.get(Calendar.MONTH) || tokenTimestamp.get(Calendar.YEAR) != now.get(Calendar.YEAR)) { // Not today... } 

Existe-t-il une manière plus correcte et / ou élégante de le faire?

Dans le Calendar Java 7, c’est probablement le mieux que vous puissiez faire. J’appendais juste un petit détail, spécifiez dans quel fuseau horaire vous voulez la date (comme indiqué par le commentaire de @Ole VV ):

 // current date in system default timezone Calendar.getInstance(TimeZone.getDefault()); // current date in Europe/London timezone Calendar.getInstance(TimeZone.getTimeZone("Europe/London")); 

Utilisez également les noms des fuseaux horaires IANA (toujours au format Continent/City , comme America/Sao_Paulo ou Europe/Berlin ). Évitez d’utiliser les abréviations à trois lettres (comme CST ou PST ) car elles sont ambiguës et non standard .


Les anciennes classes ( Date , Calendar et SimpleDateFormat ) ont beaucoup de problèmes et de problèmes de conception , et elles sont remplacées par les nouvelles API.

Pour Android, vous pouvez utiliser le Backport ThreeTen , un excellent backport pour les nouvelles classes de date / heure de Java 8, ainsi que le ThreeTenABP (plus d’informations sur son utilisation ici ).

Toutes les classes ci-dessous sont sous le package org.threeten.bp . En comparant uniquement la date (jour / mois / année), j’utilise la classe org.threeten.bp.LocalDate . J’utilise également org.threeten.bp.ZoneId pour spécifier le fuseau horaire et la classe org.threeten.bp.Instant pour convertir la valeur long millis en date:

 // millis value long millis = 1498499869249L; // get the date in system default timezone LocalDate dt = Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).toLocalDate(); // check if it's equals to today System.out.println(dt.equals(LocalDate.now(ZoneId.systemDefault()))); 

Si vous voulez un fuseau horaire différent, remplacez ZoneId.systemDefault() par ZoneId.of("Europe/London") (ou quel que soit le nom de fuseau horaire souhaité, vous pouvez obtenir une liste de tous les fuseaux horaires disponibles en appelant ZoneId.getAvailableZoneIds() ).

Et n’oubliez pas d’utiliser le même fuseau horaire dans les deux lignes pour vous assurer de comparer les valeurs correctes.


Si vous souhaitez comparer la date et l’heure (jour / mois / année et heure / minute / seconde), vous pouvez utiliser un org.threeten.bp.LocalDateTime place:

 // get the date in system default timezone LocalDateTime dt = Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).toLocalDateTime(); // check if it's equals to today System.out.println(dt.equals(LocalDateTime.now(ZoneId.systemDefault()))); 

Vous pouvez prendre l’approche d’ ici : vous définissez une date de début (aujourd’hui, à 0h du matin) et une date de fin (aujourd’hui, 23h59). Ensuite, vous pouvez vérifier si l’heure est entre:

 boolean isWithinToday(Date testDate) { return !(testDate.before(startTime) || testDate.after(endTime)); }