web-dev-qa-db-fra.com

Convertir l'heure UTC en heure locale sur Android

Dans mon projet, j'ai reçu la réponse de l'API au format JSON. J'obtiens une valeur d'heure sous forme de chaîne au format d'heure UTC comme celle-ci Jul 16, 2013 12:08:59 AM.
Je dois changer cela en heure locale . C’est là que nous utilisons l’application pour afficher l’heure locale. Comment je fais ça?

Voici un code que j'ai essayé:

String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);

Supposer que aDate contient Jul 16, 2013 12:08:59 AM

29
MadTech

Voici ma tentative:

String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);

Notez également le "a" pour le marqueur am/pm ...

56
devconsole

Je voudrais apporter la réponse moderne. Alors que SimpleDateFormat était la classe que nous avions pour analyser et formater les dates-heures en 2013 (hormis Joda-Time), il est maintenant obsolète et nous avons tellement mieux avec Java.time ou JSR-310, l'API de date et heure moderne de Java. qui est sorti avec Java 8 en 2014.

Mais la plupart des appareils Android n’exécutent toujours pas Java 8, si je comprends bien. Heureusement, vous pouvez toujours utiliser les API de date et heure modernes sur Java via ThreeTenABP, le backport de JSR-310 vers Android Java 7. Les détails se trouvent dans cette question: Comment utiliser ThreeTenABP dans Android Project .

Maintenant le code est:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
    String aDate = "Jul 16, 2013 12:08:59 AM";
    String formattedDate = LocalDateTime.parse(aDate, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault())
            .format(formatter);
    System.out.println(formattedDate);

Étant donné que mon ordinateur utilise le fuseau horaire Europe/Copenhague, qui a 2 heures d’avance sur UTC en juillet,

Jul 16, 2013 02:08:59 AM

Autres points:

  • Puisque vous avez AM dans votre chaîne, j'ai supposé que vos heures étaient dans AM, de 1 à 12. Pour les analyser et les formater correctement, vous avez besoin de h minuscule dans la chaîne de modèle de format. H majuscule correspond à l'heure du jour, de 0 à 23 heures.
  • Préférez donner un environnement local explicite au formateur (que ce soit SimpleDateFormat ou DateTimeFormatter). Si aucun paramètre régional n’est indiqué, le formateur utilisera les paramètres régionaux par défaut du périphérique. «Jul» et «AM» sont en anglais et votre code peut s'exécuter correctement sur de nombreux périphériques jusqu'à ce qu'il le soit un jour sur un périphérique dont l'environnement local est arrêté et qui se bloque. Vous avez du mal à comprendre pourquoi.
  • Si vous le pouvez, indiquez explicitement le fuseau horaire souhaité, par exemple sous la forme ZoneId.of("Asia/Kolkata"). Le fuseau horaire par défaut de la machine virtuelle Java peut être modifié par d’autres parties de votre programme ou par d’autres programmes exécutés sur la même machine virtuelle Java. Par conséquent, il n’est pas fiable.
5
Ole V.V.
//your UTC time var
long time = UTCtime;

//convert it
Time timeFormat = new Time();
timeFormat.set(time+TimeZone.getDefault().getOffset(time));

//use the value
long localTime = timeFormat.toMillis(true);
3
Tom Brinkkemper

1.Local to UTC Converter

public static String localToUTC(String dateFormat, String datesToConvert) {


        String dateToReturn = datesToConvert;

        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        sdf.setTimeZone(TimeZone.getDefault());
        Date gmt = null;

        SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFormat);
        sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));

        try {

            gmt = sdf.parse(datesToConvert);
            dateToReturn = sdfOutPutToSend.format(gmt);

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateToReturn;
    }

2. Convertisseur UTC en Local

public static String uTCToLocal(String dateFormatInPut, String dateFomratOutPut, String datesToConvert) {


    String dateToReturn = datesToConvert;

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormatInPut);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

    Date gmt = null;

    SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFomratOutPut);
    sdfOutPutToSend.setTimeZone(TimeZone.getDefault());

    try {

        gmt = sdf.parse(datesToConvert);
        dateToReturn = sdfOutPutToSend.format(gmt);

    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateToReturn; }
1
Ronak Gadhia

Utilisez le code suivant.

TimeZone defaultTimeZone = TimeZone.getDefault();
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);

//Your Code
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
String formattedDate = simpleDateFormat.format(aDate);

Cela devrait marcher.

1
Salman Khakwani