android的时区差异比预期少了1小时



我需要的是特定时区("俄罗斯/莫斯科")和用户当地时间之间的时差,时差应该以小时为单位。

我遇到了时区差有时计算错误的问题。我计算android设备的本地偏移到UTC和远程偏移到UTC之间的差异(以小时为单位)。对于大多数用户来说,这很好。。但是很多用户都在抱怨这个问题。。我无法在我的手机或模拟器上复制它。显示的"错误"时差在所有方面都少了1小时。在莫斯科是15:00,在欧洲是12:00。但是用户看到了2小时的偏移这是我的密码。

String tz="Europe/Moscow"
Calendar mCalendar = new GregorianCalendar();
mCalendar.setTimeZone( TimeZone.getTimeZone(tz));
TimeZone mTimeZone = mCalendar.getTimeZone();  
int remote = mTimeZone.getRawOffset()/1000/60/60;
Calendar mCalendar2 = new GregorianCalendar();
TimeZone mTimeZone2 = mCalendar2.getTimeZone();  
int local = mTimeZone2.getRawOffset()/1000/60/60;
return local - remote;

您犯了一个常见的错误,将时区等同于时差。它们是两种不同的东西。请阅读时区标签wiki。

当您调用getRawOffset时,它会返回该时区的标准偏移量。要获得在特定时间点有效的偏移量,可以使用getOffset,它采用您所谈论的时间点的时间戳参数。

考虑以下代码,它返回当前有效的差异:

long now = System.currentTimeMillis();
String tz = "Europe/Moscow";
TimeZone mTimeZone = TimeZone.getTimeZone(tz);  
int remote = mTimeZone.getOffset(now);
TimeZone mTimeZone2 = TimeZone.getDefault();  
int local = mTimeZone2.getOffset(now);
double differenceInHours = (local - remote) / 3600000.0;
return differenceInHours;

注意以下几点:

  • 我不需要Calendar
  • 这两个偏移都表示相同的"现在"。根据运行时间的不同,您会得到不同的结果
  • 并不是所有偏移都使用整数小时,因此此函数应返回double,而不是int。例如,试试Asia/Kolkata,它全年使用UTC+5:30,或者Australia/Adelaide,它在UTC+9:30和UTC+10:30之间交替使用

还可以考虑使用Joda Time,这是一种在Java中处理时间的更健壮的方法。

相关内容

  • 没有找到相关文章

最新更新