当前位置: 首页 > 知识库问答 >
问题:

Android时区差异比预期少1小时

谭骏
2023-03-14

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

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

共有1个答案

施晗昱
2023-03-14

你犯了一个常见的错误,就是把一个时区等同于一个时区偏移量。它们是两种不同的东西。请阅读时区标签维基。

调用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;

请注意以下几点:

  • 我不需要一个日历类。
  • 这两个偏移都是为了同一个"now"。你会得到不同的结果取决于你运行它。
  • 不是所有的偏移都使用整数小时,所以这个函数应该返回,而不是int。例如,试试全年使用UTC 5:30的Asia/Kolkata,或者在UTC 9:30和UTC 10:30之间交替使用的Australia/Adelaide

也可以考虑使用JoDA时间,这是java中使用时间的一种更健壮的方式。

 类似资料:
  • 对于我们的俄罗斯租户,我们使用“欧洲/莫斯科”时区。但我们比正确的时间提前了一个小时。 欧洲/莫斯科是世界协调时3小时。但是,当我打印日期格式与欧洲/莫斯科时区得到1小时前的正确时间。 谢谢,西亚玛拉。

  • 函数获取用于本地设备转换的简单日期格式: 产出: 日期=2018-04-22 14:30 上面的示例是基于伦敦时区的,而当我们在IST时区中尝试时,它返回的是正确的时间。 我们通过检查时区的函数来处理不同的DST时间,但它不起作用。 我肯定与夏令时有关,但我不明白。谢谢你的帮助?

  • 问题内容: 我正在使用以下代码获取当前日期(格式为12/31/1999,即mm / dd / yyyy): 我还有另一个日期格式为:2019-08-25(即yyyy / mm / dd), 所以我想找出日期之间的天数差异,如何找到天数上的差异? (换句话说,我想找到当前日期-yyyy / mm / dd格式化日期之间的差异) 问题答案: 并不是真正可靠的方法,最好使用JodaTime 这是一个近似

  • 输入#0, mov, mp4, m4a,3gp,3g2, mj2, from'instagram.mp4':元数据:major_brand: isomminor_version: 512compatible_brands: isomiso2avc1mp41编码器: Lavf55.19.104持续时间:00:00:13.61,开始: 0.000000,比特率: 1163 kb/s流#0:0(und)

  • 问题内容: 我不了解String.index Of方法的行为。 为什么p 8而不是9的输出?句子中有9个P。 问题答案: 索引从零开始: 第 一个 是index 。 来自的javadoc : 返回 索引 的的 第一次出现 在该字符序列的字符的表示由该对象,或如果字符不会发生。

  • 我使用jmeter来生成一个性能测试,为了保持简洁,我从一个json文件中读取初始数据,我有一个单线程组,在读取数据后,我在其中随机设置某些值,以防止需要时数据重复,然后我使用变量将最终数据传递给endpoint,这将最终在一个由endpoint接收的json主体中,它基本上将在数据库中生成一个新的事务。此外,我添加了一个常量计时器,在请求之间添加了7秒的延迟,测试持续时间为10分钟,没有上升,我