あなたの例のコードは一見うまく見えます。ところで、サーバーのタイムスタンプがUTCである場合(つまり、エポックタイムスタンプである場合)、現在のタイムゾーンオフセットを適用する必要はありません。System.currentTimeMillis()
つまり、サーバーのタイムスタンプがUTCである場合、システム時刻はUTC(エポック)であるため、サーバーのタイムスタンプとシステム時刻()の差を簡単に取得できます。
サーバーからのタイムスタンプが期待どおりであることを確認します。サーバーからのタイムスタンプが(ローカルタイムゾーンで)期待する日付に変換されない場合、タイムスタンプと現在のシステム時刻の差は期待どおりにはなりません。
Calendar
現在のタイムゾーンを取得するために使用します。SimpleDateFormatter
現在のタイムゾーンでaを初期化します。次に、サーバーのタイムスタンプをログに記録し、それが予期した日付であるかどうかを確認します。
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);
印刷されるサーバー時刻が期待どおりでない場合、サーバー時刻はUTCではありません。
印刷されるサーバー時刻が予想される日付である場合は、rawoffsetを適用する必要はありません。したがって、コードはより単純になります(すべてのデバッグログを除く)。
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);