我需要一个“欧洲/俄罗斯”的偏移量,以UTC为单位。这是我的代码:
Calendar mCalendar = new GregorianCalendar();
mCalendar.setTimeZone( TimeZone.getTimeZone("Europe/Moscow"));
TimeZone mTimeZone = mCalendar.getTimeZone();
int remote_offset = mTimeZone.getRawOffset()/1000/60/60;
对于UTC,它应该是-4小时。但!一些用户有3个小时的差异!!
我认为,问题是,俄罗斯不使用冬季时间。现在有些设备,但有些设备没有..我怎么能实现所有的“-4”小时?
此致
答案 0 :(得分:3)
首先,俄罗斯不是UTC-4。
问题与俄罗斯没有夏令时有关。但你的问题可能只发生在android 2.x设备上而且更少。据我记得的那样,在4.x之前删除了夏令时(如果它是用户输入的话)。另一方面,如果您收到设备在没有用户输入的情况下创建的日期,则不必将其转换为已经为UTC的日期。
但正如我所说,俄罗斯不是-4。俄罗斯/莫斯科将是+4小时。但俄罗斯真的比莫斯科大!
请看这里:http://en.wikipedia.org/wiki/Time_in_Russia
UTC+03:00 MSK−1: Kaliningrad Time Europe/Kaliningrad
UTC+04:00 MSK: Moscow Time Europe/Moscow, Europe/Volgograd, Europe/Samara
UTC+06:00 MSK+2: Yekaterinburg Time Asia/Yekaterinburg
UTC+07:00 MSK+3: Omsk Time Asia/Omsk, Asia/Novosibirsk, Asia/Novokuznetsk
UTC+08:00 MSK+4: Krasnoyarsk Time Asia/Krasnoyarsk
UTC+09:00 MSK+5: Irkutsk Time Asia/Irkutsk
UTC+10:00 MSK+6: Yakutsk Time Asia/Yakutsk
UTC+11:00 MSK+7: Vladivostok Time Asia/Vladivostok, Asia/Sakhalin
UTC+12:00 MSK+8: Magadan Time Asia/Magadan, Asia/Kamchatka, Asia/Anadyr
所以你要做的就是检查我们是否在冬天,而TimeZone就是其中之一。如果时区是其中之一,则可以在要显示时再添加一个小时。如果要转换为UTC,请删除1小时。
我不相信有可能在Android手机上更新TimeZone,这也意味着除非您为日期内置时区并且已更新的日期找到替代库,否则不可能这样做。 / p>
您可以使用您使用的函数将DateObject子类化为旧日期对象,您所要做的就是确保它在android2.x上的行为不同,而不是在android 4.x +上。< / p>
同时检查:http://www.joda.org/joda-time/
我在那里查了一下,我猜它可能比上面我的建议更有用而且更少hacky。 TimeZones是最新的,因此它可以适用于每部手机,因为它不应使用内部时区。另一方面,如果你有需要日期的函数,它可能会变得棘手。
我的建议是确保你在任何地方使用UTC并使用JodaTime格式化带有时区的日期并进行“日期时间”操作。如果确保Java Date不包含UTC以外的TimeZone。它应该工作。