我需要的是特定时区(“俄罗斯/莫斯科”)与用户当地时间之间的时差,差异应以小时为单位。
我遇到的问题是时区的差异有时是错误计算的。我计算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;
答案 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中使用时间的更强大的方法。