tl; dr
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Europe / Paris]
Pour générer une chaîne au format souhaité, passez un fichier DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
01/01/2008 00:00:00
Détails
D'autres réponses sont correctes, mais utilisent d'anciennes classes de date-heure désormais dépassées par le framework java.time.
java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 ( ThreeTen-Backport ) et adaptée à Android ( ThreeTenABP ).
Modifiez d'abord la chaîne d'entrée pour qu'elle soit conforme à la version canonique du format ISO 8601. Les formats ISO 8601 standard sont utilisés par défaut dans les classes java.time pour analyser / générer des chaînes qui représentent des valeurs date-heure. Nous devons remplacer cet ESPACE au milieu par un T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Maintenant, nous pouvons l'analyser comme un LocalDateTime
, où «Local» signifie aucune localité spécifique. L'entrée ne contient aucune information de décalage par rapport à UTC ou de fuseau horaire.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Si vous ne vous souciez pas de l'heure ni du fuseau horaire, convertissez-le en fichier LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 01/01/2008
Premier moment de la journée
Si à la place vous voulez que l'heure du jour soit définie sur le premier moment de la journée, utilisez une ZonedDateTime
classe, puis convertissez-la en LocalDate
objet pour appeler sa atStartOfDay
méthode. Sachez que le premier moment peut ne pas être l'heure à 00:00:00
cause de l'heure d'été ou peut-être d'autres anomalies.
Le fuseau horaire est crucial car à tout moment, la date varie dans le monde par zone. Par exemple, quelques instants après minuit à Paris est un nouveau jour pour les Parisiens mais c'est toujours «hier» à Montréal pour les Canadiens.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Amérique / Montréal]
UTC
Pour voir ce moment à travers l'objectif du fuseau horaire UTC , extrayez un Instant
objet. Les deux ZonedDateTime
et Instant
représenteront le même moment sur la chronologie mais apparaîtront comme deux heures d'horloge murale différentes .
An Instant
est la classe élémentaire de base de java.time, toujours en UTC par définition. Utilisez cette classe fréquemment, car vous devriez généralement faire votre logique métier, votre stockage de données et votre échange de données en UTC.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Nous voyons 5 heures du matin plutôt que le coup de minuit. Dans le format standard, le Z
à la fin est l'abréviation Zulu
et signifie «UTC».
À propos 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
.
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
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?
- Java SE 8 , Java SE 9 et versions ultérieures
- 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é java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
- Android
- Versions ultérieures des implémentations de bundle Android des classes java.time.
- Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .
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 .