Comment convertir n'importe quel TimeZone dateTime en date UTC dans JAVA [duplicate]

Sep 14 2020

Je dois utiliser la date et l'heure que je reçois par l'utilisateur et convertir cette heure en UTC à partir de l'heure donnée. À l'heure actuelle, toutes les solutions fonctionnent, mais pas comme j'avais besoin. Tout d'abord, il se convertit dans le fuseau horaire, mais je ne veux pas convertir initialement. Je dois définir ce fuseau horaire à ma date, puis convertir cette heure en UTC. À l'heure actuelle, chaque solution montre que je dois transmettre la date et l'heure, puis je reçois la date et l'heure mises à jour avec le fuseau horaire que je fournis, puis je me convertis en UTC. Ce n'était pas ma question.

Mon utilisateur m'enverra la date et l'heure de n'importe quel fuseau horaire, et mon serveur fonctionnera sur le fuseau horaire UTC. J'obtiendrai l'identifiant de zone du front-end. Je souhaite convertir cette date en heure UTC et vérifier avec mes autres conditions. Il est possible que j'obtienne l'heure UTC-7 en une seule demande, puis après la prochaine demande j'obtienne UTC + 5: 30. Donc, tout le temps doit être converti en UTC et je ne peux pas définir le fuseau horaire sur la date.

Je voulais définir le fuseau horaire spécifique à ce jour, et j'obtiens la date et l'heure de ce fuseau horaire, mais je ne suis pas en mesure de définir le fuseau horaire exact. Ici, j'ajoute mon code s'il vous plaît dites-moi où je me trompe:

Calendar laCalendar = Calendar.getInstance();
laCalendar.set(2020, 8, 14, 00, 00);
Date losAngelesDate = laCalendar.getTime();
System.out.println("LA Date1===>" + losAngelesDate);

SimpleDateFormat simpleTimeFormatForUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormatForUSA.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
String americaDateString = simpleTimeFormatForUSA.format(laCalendar.getTime());
SimpleDateFormat dateFormatUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
losAngelesDate = dateFormatUSA.parse(americaDateString);

System.out.println("LA Date2===>" + losAngelesDate);
Date utcDate = losAngelesDate;
Calendar calendar = Calendar.getInstance();
calendar.setTime(utcDate);
TimeZone timeZone = TimeZone.getTimeZone("UTC");
SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormat.setTimeZone(timeZone);
String utcTime = simpleTimeFormat.format(calendar.getTime());
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
utcDate = dateFormat.parse(utcTime);
System.out.println("UTC date====>" + utcDate);

Et ma sortie est

LA Date1===>Mon Sep 14 00:00:56 UTC 2020
LA Date2===>Sun Sep 13 17:00:00 UTC 2020
UTC date====>Sun Sep 13 17:00:00 UTC 2020

Ici, vous pouvez voir que mon DateTime est converti, mais le fuseau horaire est toujours UTC et je voulais le mettre à jour.

Réponses

1 SanketParikh Sep 14 2020 at 17:00

Voici comment je l'écrirais en utilisant les API Java 8 Date / Time.

    public static void main(String[] args)
    {
        System.out.println("UTC");
        toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("UTC")));
        
        System.out.println("America/Los_Angeles");
        toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles")));
    }

    public static void toTimeZone(Date date, TimeZone timeZone)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        Instant epochMillisInstant = Instant.ofEpochMilli(calendar.getTimeInMillis());
        LocalDateTime localDateTime = LocalDateTime.ofInstant(epochMillisInstant, ZoneId.systemDefault());
        ZonedDateTime dateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
        ZonedDateTime dateTimeWithTimeZone = dateTimeToConvert.withZoneSameInstant(timeZone.toZoneId());
        String formattedDateForNewTimeZone = dateTimeWithTimeZone.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
        System.out.println(formattedDateForNewTimeZone);
    }

Utilisation des API de date / heure uniquement Java 8 - Version plus courte

public static void main(String[] args) {
        System.out.println("UTC");
        toTimeZone(LocalDateTime.now(),"UTC");
        System.out.println("America/Los_Angeles");
        toTimeZone(LocalDateTime.now(),"America/Los_Angeles");
    }

    private static void toTimeZone(LocalDateTime localDateTime, String timeZone) {
        ZonedDateTime localDateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
        ZonedDateTime zonedDateTime = localDateTimeToConvert.withZoneSameInstant(ZoneId.of(timeZone));
        String formattedDateForNewTimeZone = zonedDateTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
        System.out.println(formattedDateForNewTimeZone);
    }
Spectric Sep 14 2020 at 16:55

Avant de convertir le calendrier en date, définissez le fuseau horaire selon vos préférences.

Par exemple:

import java.util.Calendar;
import java.util.TimeZone;

public class Timezone{

    public static void main(String []args){
       Calendar laCalendar = Calendar.getInstance();
       TimeZone timezone = TimeZone.getTimeZone("UTC");
       laCalendar.set(2020, 8, 14, 00, 00);
       laCalendar.setTimeZone(timezone);
       java.util.Date losAngelesDate = laCalendar.getTime();
       System.out.println(losAngelesDate.toString());
    }
}