Skip to content

So konvertieren Sie den UTC-Zeitstempel in die lokale Gerätezeit in Android

Lösung:

Java:

int offset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings();
long now = System.currentTimeMillis() - offset;

Kotlin:

Int offset = TimeZone.getDefault()rawOffset + TimeZone.getDefault().dstSavings
Long now = System.currentTimeMillis() - offset

Konvertieren eines Datumsstrings im Format "2011-06-23T15:11:32" in unsere Zeitzone.

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;
}

Der Code in Ihrem Beispiel sieht auf den ersten Blick gut aus. Übrigens, wenn der Server-Zeitstempel in UTC ist (dh es ist ein Epochen-Zeitstempel), sollten Sie den aktuellen Zeitzonen-Offset nicht anwenden müssen. Mit anderen Worten, wenn der Server-Zeitstempel in UTC angegeben ist, können Sie einfach die Differenz zwischen dem Server-Zeitstempel und der Systemzeit ermitteln (System.currentTimeMillis()), da die Systemzeit in UTC (Epoche) angegeben ist.

Ich würde überprüfen, ob der Zeitstempel von Ihrem Server Ihren Erwartungen entspricht. Wenn der Zeitstempel vom Server nicht in das erwartete Datum (in der lokalen Zeitzone) konvertiert wird, ist der Unterschied zwischen dem Zeitstempel und der aktuellen Systemzeit nicht das, was Sie erwarten.

Verwenden Calendar um die aktuelle Zeitzone abzurufen. Initialisieren a SimpleDateFormatter mit der aktuellen Zeitzone; Protokollieren Sie dann den Server-Zeitstempel und überprüfen Sie, ob es sich um das erwartete Datum handelt:

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

Wenn die Serverzeit gedruckt wird ist nicht was du erwartest ist dann deine Serverzeit nicht in UTC.

Wenn die gedruckte Serverzeit das erwartete Datum ist, müssen Sie den rawoffset nicht darauf anwenden. Ihr Code wäre also einfacher (abzüglich der gesamten Debug-Protokollierung):

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);
Click to rate this post!
[Total: 0 Average: 0]



Anderer Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.