tl; dr
LocalDate
.now(ZoneId.of("Pacific/Auckland")) // Get the date-only value for the current moment in a specified time zone.
.minusWeeks(1) // Go back in time one week.
.atStartOfDay(ZoneId.of("Pacific/Auckland")) // Determine the first moment of the day for that date in the specified time zone.
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) // Generate a string in standard ISO 8601 format.
.replace("T" , " ") // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character.
java.time
L'approche moderne utilise les classes de java.time.
La classe LocalDate
représente une valeur de date uniquement sans heure et sans fuseau horaire.
Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie autour du globe par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu'encore "hier" dans Montréal Québec.
Spécifiez un proper time zone name dans le format de continent/region
, tels que America/Montreal
, Africa/Casablanca
ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que EST
ou IST
car ce sont des et non des fuseaux horaires, non normalisés, et même pas uniques (!).
ZoneId z = ZoneId.forID("America/Montreal") ;
LocalDate now = LocalDate.now (z) ;
faire quelques calculs en utilisant les méthodes minus…
et plus…
.
LocalDate weekAgo = now.minusWeeks(1);
Laissez java.time déterminer le premier moment du jour pour votre fuseau horaire. Ne supposez pas que la journée commence à 00:00:00
. Des anomalies telles que l'heure d'été signifient que le jour peut commencer à une autre heure, par exemple 01:00:00
.
ZonedDateTime weekAgoStart = weekAgo.atStartOfDay(z) ;
Générer une chaîne représentant cet objet ZonedDateTime
à l'aide d'un objet DateTimeFormatter
. Rechercher Stack Overflow pour beaucoup plus de discussions sur cette classe.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = weekAgoStart.format(f) ;
Ce format standard est proche de ce que vous voulez, mais a un T
au milieu où vous voulez un espace. Remplacez donc SPACE par T
.
output = output.replace("T" , " ") ;
A propos java.time
Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date
, Calendar
, & SimpleDateFormat
. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.
Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.
Où obtenir les classes java.time?
- Java SE 8, Java SE 9, et plus tard
- intégré.
- Partie de l'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et corrections mineures.
- Java SE 6 et Java SE 7
- Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
- Android
Joda-Time
Mise à jour: Le projet Joda-Time est maintenant en mode maintenance. L'équipe conseille la migration vers les classes java.time. L'utilisation de la bibliothèque Joda-Time facilite considérablement le travail de la date et de l'heure.
Notez l'utilisation d'un fuseau horaire. Si cette option est omise, vous travaillez dans UTC ou dans le fuseau horaire par défaut actuel de la JVM.
DateTime now = DateTime.now (DateTimeZone.forID("America/Montreal")) ;
DateTime weekAgo = now.minusWeeks(1);
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay();
Je pense que vous devriez utiliser Calendar.roll() au lieu de Calendar.add() si vous voulez gérer la modification mois/année. Votre exemple pourrait être faux entre le 1er et le 6 janvier. –
Je pense que le contraire est vrai: roll() ne gère pas les changements mois/année lorsqu'il est appelé sur la date, tandis que add() le fait. –
Ok, mon mauvais! ;-) –