我需要的是特定时区("俄罗斯/莫斯科")和用户当地时间之间的时差,时差应该以小时为单位。
我遇到了时区差有时计算错误的问题。我计算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中处理时间的更健壮的方法。