Comment convertir l'horodatage UTC en heure locale de l'appareil dans android
J'ai besoin de convertir l'horodatage UTC que je reçois du serveur à l'heure du périphérique local. actuellement je reçois 5 heures de différence dans mon temps. par exemple, lorsque je poste sur le serveur, l'Heure de publication indique il y a 5 heures au lieu d'une seconde. Comment résoudre ce problème. merci
Voici le code que je fais
long timestamp = cursor.getLong(columnIndex);
CharSequence relTime = DateUtils
.getRelativeTimeSpanString(timestamp * 1000
+ TimeZone.getDefault().getRawOffset(),
System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS);
((TextView) view).setText(relTime);
7 réponses
Le code de votre exemple semble bien à première vue. BTW, si l'horodatage du serveur est en UTC (c'est-à-dire un horodatage d'époque), vous ne devriez pas avoir à appliquer le décalage de fuseau horaire actuel. En d'autres termes, si l'horodatage du serveur est en UTC, Vous pouvez simplement obtenir la différence entre l'horodatage du serveur et l'heure système (System.currentTimeMillis()
) car l'heure système est en UTC (epoch).
Je vérifierais que l'horodatage provenant de votre serveur est ce que vous attendez. Si le timestamp du serveur ne pas convertir dans la date que vous attendez (dans le fuseau horaire local), alors la différence entre l'horodatage et l'heure système actuelle ne sera pas ce que vous attendez.
Utiliser Calendar
pour obtenir le fuseau horaire actuel. Initialisez un SimpleDateFormatter
avec le fuseau horaire actuel; puis enregistrez l'horodatage du serveur et vérifiez si c'est la date que vous attendez:
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
/* debug: is it local time? */
Log.d("Time zone: ", tz.getDisplayName());
/* date formatter in local timezone */
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
sdf.setTimeZone(tz);
/* print your timestamp and double check it's the date you expect */
long timestamp = cursor.getLong(columnIndex);
String localTime = sdf.format(new Date(timestamp * 1000)); // I assume your timestamp is in seconds and you're converting to milliseconds?
Log.d("Time: ", localTime);
Si l'heure du serveur qui est imprimée n'est pas ce que vous attendez, alors votre heure du serveur est Pas en UTC.
Si l'heure du serveur qui est imprimé est la date que vous attendez alors vous ne devriez pas avoir à appliquer le rawoffset à elle. Ainsi, votre code serait plus simple (moins toute la journalisation de débogage):
long timestamp = cursor.getLong(columnIndex);
Log.d("Server time: ", timestamp);
/* log the device timezone */
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone: ", tz.getDisplayName());
/* log the system time */
Log.d("System time: ", System.currentTimeMillis());
CharSequence relTime = DateUtils.getRelativeTimeSpanString(
timestamp * 1000,
System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS);
((TextView) view).setText(relTime);
int offset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings();
long now = System.currentTimeMillis() + offset;
Conversion d'une chaîne de date du format "2011-06-23T15:11:32" à notre fuseau horaire.
private String getDate(String ourDate)
{
try
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date value = formatter.parse(ourDate);
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy HH:mm"); //this format changeable
dateFormatter.setTimeZone(TimeZone.getDefault());
ourDate = dateFormatter.format(value);
//Log.d("ourDate", ourDate);
}
catch (Exception e)
{
ourDate = "00-00-0000 00:00";
}
return ourDate;
}
J'ai fait quelque chose comme ça pour obtenir la date dans le fuseau horaire de l'appareil local à partir de L'horodatage UTC.
private long UTC_TIMEZONE=1470960000;
private String OUTPUT_DATE_FORMATE="dd-MM-yyyy - hh:mm a"
getDateFromUTCTimestamp(UTC_TIMEZONE,OUTPUT_DATE_FORMATE);
Ici est la fonction
public String getDateFromUTCTimestamp(long mTimestamp, String mDateFormate) {
String date = null;
try {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.setTimeInMillis(mTimestamp * 1000L);
date = DateFormat.format(mDateFormate, cal.getTimeInMillis()).toString();
SimpleDateFormat formatter = new SimpleDateFormat(mDateFormate);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date value = formatter.parse(date);
SimpleDateFormat dateFormatter = new SimpleDateFormat(mDateFormate);
dateFormatter.setTimeZone(TimeZone.getDefault());
date = dateFormatter.format(value);
return date;
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
Résultat :
12-08-2016 - 04:30 PM
J'espère que cela fonctionnera pour les autres.
Local à UTC
DateTime dateTimeNew = new DateTime(date.getTime(),
DateTimeZone.forID("Asia/Calcutta"));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String datetimeString = dateTimeNew.toString("yyyy-MM-dd HH:mm:ss");
long milis = 0;
try {
milis = simpleDateFormat.parse(datetimeString).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
Cela peut aider quelqu'un avec la même exigence
private String getDate(long time){
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
String dateString = formatter.format(new Date(time));
String date = ""+dateString;
return date;
}
Je l'ai fait en utilisant Extension Functions
dans kotlin
fun String.toDate(dateFormat: String = "yyyy-MM-dd HH:mm:ss", timeZone: TimeZone = TimeZone.getTimeZone("UTC")): Date {
val parser = SimpleDateFormat(dateFormat, Locale.getDefault())
parser.timeZone = timeZone
return parser.parse(this)
}
fun Date.formatTo(dateFormat: String, timeZone: TimeZone = TimeZone.getDefault()): String {
val formatter = SimpleDateFormat(dateFormat, Locale.getDefault())
formatter.timeZone = timeZone
return formatter.format(this)
}
Utilisation:
"2018-09-10 22:01:00".toDate().formatTo("dd MMM yyyy")
Output: "11 Sep 2018"
Remarque:
Assurez la validation appropriée.