J'ai besoin de convertir l'horodatage UTC que je reçois du serveur vers 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 la publication est de 5 heures au lieu d'une seconde. Comment résoudre ce problème. Merci
Ci-dessous 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);
Le code de votre exemple semble bien au premier abord. Par BTW, si l’horodatage du serveur est au format UTC (c’est-à-dire un horodatage de période), 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 du système (System.currentTimeMillis()
), car l'heure du système est en UTC (Époque).
Je voudrais vérifier que l'horodatage provenant de votre serveur correspond à ce que vous attendez. Si l'horodatage du serveur ne se convertit pas à la date attendue (dans le fuseau horaire local), la différence entre l'horodatage et l'heure système actuelle ne correspondra pas à ce que vous attendiez.
Utilisez Calendar
pour obtenir le fuseau horaire actuel. Initialiser une 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, l'heure de votre serveur est pas en UTC.
Si l'heure du serveur imprimée correspond à la date prévue, vous ne devriez pas avoir à lui appliquer le rawoffset. Donc, votre code serait plus simple (moins toute la journalisation du 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" dans 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;
}
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)
}
Usage:
"2018-09-10 22:01:00".toDate().formatTo("dd MMM yyyy")
Output: "11 Sep 2018"
Remarque:
Assurer la validation appropriée.
J'ai fait quelque chose comme ceci 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);
Voici 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.
Cela peut aider quelqu'un avec les mêmes exigences
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;
}
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();
}