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

时间:2014-02-08 13:50:33

标签: android timezone

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

我遇到的问题是时区的差异有时是错误计算的。我计算Android设备的本地偏移量与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;

1 个答案:

答案 0 :(得分:4)

您将时区时区偏移等同起来的常见错误。他们是两个不同的东西。请阅读timezone tag 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中使用时间的更强大的方法。