0
votes

Convertir une date UTC en une date de différentes fuseaux horaires

Je reçois une date qui représente une date d'heure dans l'UTC. Disons: 21-JUN-2019 10:00 STRUT>

J'aimerais convertir cette dateTétime en TimeZone "Europe / Vienne" Attendez-vous: 21-juin 2019 12:00 strong> p>

Je ne comprends pas, pourquoi mon code ci-dessous montre la même heure pour les deux p>

        // Unfortunately this date has the wrong time zone (Local Time Zone),
        // because Date assumes Local Time Zone the database stores timestamps 
        // in utc that's why I now convert to a datestring and reparse

        Date finishTimeWrongTimeZone = new Date(new Date().getYear(), Calendar.JUNE, 21);
        // in reality i call the db here like getFinishTime();

        // get the plain date string without time shifting
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd HH:mm");
        String dateWithoutTimeZone = formatter.format(finishTimeWrongTimeZone);

        // add the timezone to the formatter and reinterpret the datestring
        // effectively adding the correct time zone the date should be in
        formatter.setTimeZone(TimeZone.getTimeZone("UTC"));

        String finishTime = null;
        try {

            Date dateWithCorrectTimeZone = formatter.parse(dateWithoutTimeZone);

            // Convert to expected local time zone (europe/vienna)
            formatter.setTimeZone(TimeZone.getTimeZone("Europe/Vienna"));
            finishTime = formatter.format(dateWithCorrectTimeZone);

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(finishTime);


7 commentaires

Une date n'a pas de fuseau horaire. Conceptuellement, c'est un instant dans le temps (il enveloppe seulement un nombre de millisecondes après une Uich Epoch), peu importe où vous êtes. Ce n'est que lorsque vous le représentez comme une chaîne que vous attachez un fuseau horaire, il s'agit donc du travail de l'objet DateFormat de faire la conversion.


@Shakka, le commentaire de SPI ci-dessus est exactement pourquoi votre approche de "No Joda ou localDate" est défectueuse. Ces nouvelles façons de faire des choses existent précisément parce que les types de date JDK Legacy JDK sont mal nommés à tout le moins et difficiles à travailler correctement.


Remarque latérale: La classe de données est obsolète, une conception médiocre et certaines méthodes sont obsolètes si possible, utilisez l'API Java.Time, la classe ZonedDateTime et votre cas GetYear () est obsolète.


Je comprends que "les types de date JDK sont mal". J'ai juste ces limitations. J'ai essayé de définir le fuseau horaire à Dateformat Aswell mais cela ne fonctionne pas.


Assurez-vous que nouvelle date (...) (qui est obsolète BTW) produit une heure dans le fuseau horaire local et non UTC.


Stackoverflow.com/Questtions/2891361/...


@ TIIJ7, comme indiqué ci-dessus, java.util.date est juste un certain nombre de millisecondes depuis l'époque et, en tant que tel, ne contient pas vraiment d'informations de fuseau horaire. Toutefois, ce constructeur spécifique utilise effectivement le fuseau horaire du système par défaut pour inférer comment convertir des valeurs de la minute d'heure (0-0 pour ce cas) dans la valeur des secondes d'époque.


4 Réponses :


0
votes

Veuillez utiliser SimpleDateFormat pour convertir le fuseau horaire xxx


2 commentaires

Désolé, cela ne fonctionne pas pour moi, j'ai la même date d'heure!


En rétrospective: cela n'a pas fonctionné, car un nouveau constructeur de date () définit les paramètres régionaux par défaut comme TimeZone et je n'obtiens donc aucun changement dans le temps.



1
votes

modifier le fuseau horaire avant de faire le format. La date sera "convertie" en conséquence, mais comme nous vous l'avons déjà dit, ce vieux style de codage a beaucoup de défauts: xxx


1 commentaires

J'aiah je vois ... mon test est faux. La nouvelle date utilise le fuseau horaire local ... Je ferai rapport si cela résout mon problème!



1
votes

J'utilise un objet formateur et modifie le fuseau horaire sur celui-ci

​​SimpleDateformat Format = Nouveau SimpleDateFormat ("DD-MM-AAAAYY HH: mm"); FORMAT.SETTIMEZONE (TimeZone.GetTimeZone ("UTC")); P>

Date dUtc = format.parse("21-06-2019 10:00");
System.out.println(dUtc);

TimeZone europeVienna = TimeZone.getTimeZone("europe/vienna");

format.setTimeZone(europeVienna);
String sVienna = format.format(dUtc);
System.out.println(sVienna);


0 commentaires

1
votes

Solution moderne ( java.time >) Solution

J'ai une version pour l'ancienne API ci-dessous comme si vous avez demandé, mais pour la complétude, je fournirai également la solution plus moderne. Je vous recommande de regarder dans Threeten-Backport si la mise à jour de Java n'est pas une option: p> xxx pré>

ancienne ( java.util code>) solution h3>

nouvelle date (...) code> est obsolète et vous ne devez pas l'utiliser. Si vous vraiment em> avez besoin de coller à l'ancienne API; Vous devrez utiliser calendrier code>: p> xxx pré>

puis utilisez un dateformat code> avec le fuseau horaire que vous souhaitez réellement Pour l'imprimer avec: p> xxx pré>

sortie h3>

Les deux solutions doivent produire (au moment de la rédaction, en 2019): P>

2019-06-21 12:00


3 commentaires

merci ces travaux, le seul problème que j'ai, c'est que je reçois une date de la DB et si j'appelle le calendrier comme: utcfinish.settime (mydate) -> Je reçois le même comportement (ce qui signifie que je reçois l'heure de l'UTC )


HMM, le problème est probablement avec la manière dont vous récupérez la date de la base de données. Quand je devais obtenir des dates de la base de données, j'ai également eu un problème comme ça. Je devais utiliser le Méthode GetDate qui prend un calendrier supplémentaire en tant qu'entrée et transmettez-le un calendrier avec UTC TimeZone. Pas sûr que ça va le réparer pour vous, mais cela vaut la peine d'être coupé.


C'est un bon moyen d'améliorer ma nouvelle solution (voir ci-dessus). Merci pour vos commentaires, vous m'avez conduit au démonzone Détail du fuseau horaire par défaut!