【问题标题】:android: timezone offset for "Europe/Russia" [duplicate]android:“欧洲/俄罗斯”的时区偏移[重复]
【发布时间】:2014-02-08 19:04:12
【问题描述】:

我需要将“欧洲/俄罗斯”偏移到 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”小时?

问候

【问题讨论】:

  • Europe/Russia 不是有效的时区标识符,至少在 IANA-tzdb 中不是。他们的命名方案是 {continent}/{exemplar-city}。
  • @MenoHochschild,你说得对,并不是俄罗斯的所有时区都是莫斯科。
  • @LoïcFaure-Lacroix 事实上,俄罗斯比莫斯科大得多。问题是 Java 使用无效标识符做什么,即只是映射到 GMT+00:00!
  • @user1908375 - 请不要重复发布相同的内容。如果您有更多内容要添加到your original question,您可以随时进行编辑。
  • 对不起.. 在这里.. 我使用“欧洲/莫斯科”

标签: android time timezone


【解决方案1】:

首先,俄罗斯不是 UTC-4。

问题与俄罗斯没有夏令时有关。但是您的问题可能只发生在 android 2.x 设备和更少的设备上。据我记得,夏令时在 4.x 之前被删除(如果它是用户输入的话)。另一方面,如果您收到由设备在没有用户输入的情况下创建的日期,则不必将其转换为 UTC,因为它已经是 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,这也意味着,除非您找到一个内置时区且已更新的 Dates 替代库,否则不可能做到这一点。

您可以使用您使用的函数将 DateObject 子类化为与旧日期对象一样的行为,您所要做的就是确保它在 android2.x 而不是 android 4.x+ 上的行为不同。

还要检查这个:http://www.joda.org/joda-time/

我在那里检查过,我想它可能比我上面的建议更有用且不那么老套。 TimeZones 是最新的,因此它只能适用于每部手机,因为它不应该使用内部时区。另一方面,如果您有需要 Date 的函数,则可能会变得很棘手。

我的建议是确保您在任何地方都使用 UTC,并使用 JodaTime 来格式化带有时区的日期并执行“日期时间”操作。如果您确保您的 Java 日期从不包含 UTC 以外的时区。它应该工作。

【讨论】:

  • 很抱歉我的错字。我使用“Europe/Moscow”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2013-03-17
  • 1970-01-01
  • 2021-04-21
  • 2018-10-30
相关资源
最近更新 更多