【问题标题】:android timezone difference is 1 hour less then expectedandroid时区差异比预期少1小时
【发布时间】:2014-03-05 23:45:24
【问题描述】:

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

我遇到了时区差异有时被错误计算的问题。我计算 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;

【问题讨论】:

  • 由于“夏令时”/“夏令时”,您的时钟是否每年向前/向后移动两次?在做减法之前看看你得到的数字。
  • 我不知道..因为它不会发生在我身上。通过我的电话一切正常。这些是来自用户的错误报告.. :(
  • 莫斯科目前比伦敦快 4 小时,尽管在夏季它会提前 3 小时,因为英国在春季将时钟提前一个小时。其他国家也会这样做。你考虑到这一点了吗?抱怨的用户和不抱怨的用户之间是否存在某种模式?看看这些国家的时间,看看他们是否改变时钟。

标签: android timezone


【解决方案1】:

您犯了将 时区 等同于 时区偏移 的常见错误。他们是两个不同的东西。请阅读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 中处理时间的更稳健的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多