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);
25
demandé sur cavallo 2013-02-13 16:17:11

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);
31
répondu pestrella 2013-02-14 13:22:31
int offset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings();
long now = System.currentTimeMillis() + offset;
50
répondu prgDevelop 2017-11-15 09:22:53

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;
}
28
répondu madhu sudhan 2018-04-21 09:54:53

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.

1
répondu Chintan Khetiya 2016-08-10 10:35:29

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
répondu Anand Jagtap 2015-05-21 11:50:31

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;
    }
0
répondu CLIFFORD P Y 2017-02-05 06:08:25

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.

0
répondu Kasim Rangwala 2018-09-11 18:31:16