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
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 ...
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:
h
minuscule dans la chaîne de modèle de format. H
majuscule correspond à l'heure du jour, de 0 à 23 heures.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.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.//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);
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; }
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.