你的示例代码看起来一切正常。顺便说一下,如果服务器时间戳是UTC(即它是一个纪元时间戳),那么您就不必应用当前时区偏移量。换句话说,如果服务器时间戳是UTC,则可以将服务器时间戳和系统时间(System.currentTimeMillis()
)之间的差异作为系统时间是UTC(纪元)而简单获取。
我会检查来自服务器的时间戳是否符合您的预期。如果来自服务器的时间戳无法转换为您预期的日期(在本地时区),则当前时间戳与系统时间之间的差异将不符合您的预期。
使用 Calendar
获取当前时区。使用当前时区初始化 SimpleDateFormatter
;然后记录服务器时间戳并验证其是否为您所期望的日期:
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone: ", tz.getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
sdf.setTimeZone(tz);
long timestamp = cursor.getLong(columnIndex);
String localTime = sdf.format(new Date(timestamp * 1000));
Log.d("Time: ", localTime);
如果打印出来的服务器时间不是您期望的时间,那么您的服务器时间不是在UTC时间。
如果打印出来的服务器时间是您期望的日期,则您不需要对其应用原始偏移量。因此,您的代码将更简单(减去所有调试日志):
long timestamp = cursor.getLong(columnIndex);
Log.d("Server time: ", timestamp);
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone: ", tz.getDisplayName());
Log.d("System time: ", System.currentTimeMillis());
CharSequence relTime = DateUtils.getRelativeTimeSpanString(
timestamp * 1000,
System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS);
((TextView) view).setText(relTime);
long now = System.currentTimeMillis() - gmtOffset
- vigilancer