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.

4
demandé sur user2293813 2013-04-19 19:15:00

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?

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 .

3
répondu Basil Bourque 2017-09-04 00:43:23

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.

0
répondu M S Parmar 2015-09-22 09:46:59