web-dev-qa-db-fra.com

Comment convertir l'horodatage UTC en heure locale de l'appareil sous Android

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);
28
cavallo

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);
32
pestrella
int offset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings();
long now = System.currentTimeMillis() + offset;
53
prgDevelop

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;
}
32
madhu sudhan

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.

3
Kasim Rangwala

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.

1
Chintan Khetiya

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;
    }
0
CLIFFORD P Y

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();
}
0
Anand Jagtap