SimpleDateFormat retourne le mauvais fuseau horaire lors de la séance
je suis confronté à un problème étrange lors de la création de l'objet Date. J'ai le code ci-dessous pour définir le fuseau horaire de la date à UTC. Avant la déclaration parse je vois que sdfDate a fuseau horaire comme UTC mais après la déclaration parse je vois que punchDate a valeur: Sam Mar 30 01:00: 00 CET 2013, ce que je crois vient de mon système. Mais comment faire en sorte que le fuseau horaire reste le même, même après l'analyser.
Date punchDate = null;
Date punchTime = null;
SimpleDateFormat sdfDate = new SimpleDateFormat("dd.MM.yyyy");
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
try
{
sdfDate.setTimeZone(TimeZone.getTimeZone("UTC"));
sdfTime.setTimeZone(TimeZone.getTimeZone("UTC"));
punchDate = sdfDate.parse(arg1);
punchTime = sdfTime.parse(arg2);
}
catch (ParseException pe)
{
System.out.println("Parse exception " +pe.getMessage());
}
My l'exigence est essentiellement que j'ai besoin de faire un objet Date à partir de L'entrée String mais le fuseau horaire doit rester UTC.
2 réponses
tl; dr
je dois faire un objet Date à partir de L'entrée String mais le fuseau horaire doit rester UTC.
LocalDate.parse(
"23.01.2017" ,
DateTimeFormatter.ofPattern( "dd.MM.uuuu" )
)
... et ...
LocalTime.parse( "12:34:56" )
...combiner ...
OffsetDateTime.of( datePart , timePart , ZoneOffset.UTC )
détails
vous utilisez des anciennes classes de date confuses et gênantes qui sont maintenant supplantées par le java.les classes de temps.
OffsetDateTime
vous dites que vous êtes certain que vos entrées étaient destinées à UTC malgré l'absence d'un tel indicateur. Nous allons donc analyser la partie date, analyser la partie heure-of-day, puis combiner tout en assignant un offset-from-UTC de zéro pour UTC .
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) ;
LocalDate ld = LocalDate.parse( "23.01.2017" , f ) ;
l'entrée de temps de la journée se trouve être conforme à la norme de formatage ISO 8601 utilisé par défaut dans le java.les classes de temps. Donc pas besoin de spécifier le format.
LocalTime lt = LocalTime.parse( "12:34:56" ) ;
combinez.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
fuseau horaire
si vous voulez voir ce même moment que présenté dans l'Heure de l'horloge murale d'une région particulière, appliquer un ZoneId
pour obtenir un ZonedDateTime
.
spécifier un nom du fuseau horaire approprié dans le format de continent/region
, tel que America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 3-4 lettres comme EST
ou IST
car ils sont pas vrai fuseaux horaires, non standardisé, et même pas unique(!).
ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ; // Same simultaneous moment, same point on the timeline.
ISO 8601
conseil: pour échanger ce type de données sous forme de texte, Utilisez exclusivement les formats de la norme ISO 8601 . Ils les formats sont raisonnablement conçus pour être non ambigus, faciles à traiter à la machine et faciles à lire dans de nombreuses cultures par les gens.
La java.les classes de temps utilisent les formats standards par défaut lors de l'analyse et de la génération de chaînes.
String output = Instant.now().toString() ;
2017-01-23T12: 34 :56.123456789 Z
Convertir
Éviter l'héritage java.util.Date
de la classe. Mais s'il le faut, vous pouvez vous convertir. Rechercher de nouvelles méthodes ajoutées aux anciennes classes.
la classe Instant
représente un moment sur la ligne du temps dans UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
extraire un objet Instant
de votre OffsetDateTime
en appelant toString
.
Instant instant = odt.toInstant() ;
java.util.Date date = Date.fromInstant( instant ) ;
... aller dans l'autre sens…
Instant instant = myJavaUtilDate.toInstant() ;
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
à Propos de java.heure
Le de java.time framework est construit dans Java 8 et plus tard. Ces classes remplacent les anciennes classes de date legacy telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
le Joda-Time project , maintenant en mode maintenance , conseille la migration vers le java.temps classes.
pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .
où obtenir le java.les classes de temps?
- Java SE 8 , Java SE 9 , et plus tard
- intégré.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et Java SE 7
- une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
Le ThreeTen-Extra le projet s'étend java.temps avec des cours supplémentaires. Ce projet est une prouver base pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval
, YearWeek
, YearQuarter
, et plus .
votre objet Date sera le même en ce qui concerne votre heure système locale. Vous avez créé avec l'objet date local avec le fuseau horaire local et en assignant le fuseau horaire converti(UTC) au fuseau horaire local.
Date punchDate = null;
Date punchTime = null;
ainsi votre valeur de date reste la même, mais elle affiche dans un fuseau horaire différent.