我需要将"欧洲/俄罗斯"偏移到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"小时?
问候
首先,俄罗斯不是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
所以你要做的就是检查我们是否在冬天,时区是否就是其中之一。如果时区是其中之一,您可以在想要显示时再添加一个小时。当您想转换为UTC时,请删除1小时。
我认为不可能在安卓手机上更新时区,这也意味着,除非你找到一个内置时区并更新的日期替代库,否则不可能做到这一点。
你可以用你用来表现得像旧日期对象一样的函数来划分DateObject的子类,你所要做的就是确保它在android2.x上的表现不同,而不是在android 4.x+.上
还要检查以下内容:http://www.joda.org/joda-time/
我在那里检查了一下,我想它可能比我上面的建议有用,也不那么粗糙。时区是最新的,所以它可以适用于每部手机,因为它不应该使用内部时区。另一方面,如果您的函数需要Date,则可能会变得棘手。
我的建议是,确保在任何地方都使用UTC,并使用JodaTime用时区格式化日期,并执行"datetime"操作。如果您确保Java日期从不包含UTC以外的时区。它应该起作用。