tl; dr
LocalDate.of( 2014 , 2 , 11 )
Si vous insistez pour utiliser la terrible vieille java.util.Date
classe, effectuez une conversion à partir des classes java.time modernes .
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
Détails
Si vous voulez "facile", vous devriez utiliser le nouveau package java.time dans Java 8 plutôt que les classes notoirement gênantes java.util.Date et .Calendar fournies avec Java.
java.time
Le framework java.time intégré à Java 8 et versions ultérieures remplace les anciennes classes gênantes java.util.Date/.Calendar.
Date uniquement
Une LocalDate
classe est proposée par java.time pour représenter une valeur de date uniquement sans heure ni fuseau horaire. Vous avez besoin d'un fuseau horaire pour déterminer une date, car un nouveau jour se lève plus tôt à Paris qu'à Montréal par exemple. La ZoneId
classe est pour les fuseaux horaires.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Vider dans la console:
System.out.println ( "today: " + today + " in zone: " + zoneId );
aujourd'hui: 26/11/2015 dans la zone: Asie / Singapour
Ou utilisez une méthode d'usine pour spécifier l'année, le mois, le jour.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 11/02/2014
Ou passez un numéro de mois 1-12 plutôt qu'un DayOfWeek
objet enum.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Fuseau horaire
A LocalDate
n'a aucune signification réelle tant que vous ne l'avez pas ajusté dans un fuseau horaire. Dans java.time, nous appliquons un fuseau horaire pour générer un ZonedDateTime
objet. Cela signifie également une heure de la journée, mais à quelle heure? Il est généralement logique de suivre le premier moment de la journée. Vous pourriez penser que cela signifie l'heure 00:00:00.000
, mais pas toujours vrai à cause de l'heure d'été (DST) et peut-être d'autres anomalies. Au lieu de supposer cette heure, nous demandons à java.time de déterminer le premier moment de la journée en appelant atStartOfDay
.
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 3 à 4 lettres telle que EST
ou IST
car ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!).
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Asie / Singapour]
UTC
Pour le travail back-end (logique métier, base de données, stockage et échange de données), nous utilisons généralement le fuseau horaire UTC . Dans java.time, la Instant
classe représente un moment sur la chronologie en UTC. Un objet Instant peut être extrait d'un ZonedDateTime en appelant toInstant
.
Instant instant = zdt.toInstant();
instant: 2014-02-10T16: 00: 00Z
Convertir
Vous devriez éviter java.util.Date
complètement d' utiliser la classe. Mais si vous devez interagir avec un ancien code non encore mis à jour pour java.time , vous pouvez effectuer une conversion d'avant en arrière. Recherchez de nouvelles méthodes de conversion ajoutées aux anciennes classes.
java.util.Date d = java.util.from( instant ) ;
…et…
Instant instant = d.toInstant() ;
À 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. Hibernate 5 et JPA 2.2 prennent en charge java.time .
Où obtenir les classes java.time?
MISE À JOUR: La bibliothèque Joda-Time est maintenant en mode maintenance et conseille la migration vers les classes java.time . Je laisse cette section en place pour l'histoire.
Joda-Time
D'une part, Joda-Time utilise une numérotation judicieuse, donc février 2
ne l' est pas 1
. Une autre chose, un Joda-Time DateTime connaît vraiment son fuseau horaire attribué contrairement à un java.util.Date qui semble avoir un fuseau horaire mais pas.
Et n'oubliez pas le fuseau horaire. Sinon, vous obtiendrez la valeur par défaut de la JVM.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Vider dans la console…
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Lors de l'exécution…
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
Conversion
Si vous devez convertir en java.util.Date pour une utilisation avec d'autres classes…
java.util.Date date = dateTimeSingapore.toDate();