Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android上时区不正确的问题_Java_Android_Jodatime - Fatal编程技术网

Java Android上时区不正确的问题

Java Android上时区不正确的问题,java,android,jodatime,Java,Android,Jodatime,现在莫斯科的正确时区是UTC+3。但安卓4.4.4只知道莫斯科的UTC+4 和java.util.Date给出错误的时间: Date now = new Date(); Sat Nov 21 00:37:24 GMT+04:00 2015 1448051844024 in (milliseconds) 使用Jodaorg.Joda.time DateTime nowWithCorrect = new DateTime() .w

现在莫斯科的正确时区是UTC+3。但安卓4.4.4只知道莫斯科的UTC+4

java.util.Date
给出错误的时间:

Date now = new Date();    
Sat Nov 21 00:37:24 GMT+04:00 2015
1448051844024 in (milliseconds)
使用Joda
org.Joda.time

DateTime nowWithCorrect = new DateTime()
                              .withZone(DateTimeZone.forID("Europe/Moscow"));
2015-11-20T23:37:24.023+03:00
1448051844024 in (milliseconds)
但问题是用户(在时区不正确的设备上)已经手动更正了设备上的时间。和
joda
java
以毫秒为单位给出了错误的时间

我从web服务中获取时间戳,并在设备上计算与本地时间不同的时间。但当地时间不正确,给出的结果不正确

我要检查
joda
java
时间并手动更正时间戳

问题:我可以用正确的获取时区之间的差异和时间之间的差异(以小时为单位)(
now
now)?
例如:
differentTimeZone=1
differentTimeHours=1

混淆了俄罗斯的时区变化 近年来,俄罗斯经历了一些令人困惑的时区变化,莫斯科在
+03:00
+04:00
之间来回移动。请参阅和上的维基百科页面

2011年秋季之前,莫斯科的标准时间为
+03:00
,时间为
+04:00

从2011年秋季开始,俄罗斯决定永久保留DST,
+04:00
,并取消标准时间
+03:00
。看

2014年7月,这一决定被彻底改变。现在,俄罗斯的标准时间是永久性的
+03:00
,并且已经废除了DST(不再是
+04:00

过时的
tz
数据库 因此,我认为您的问题是由于您的(以前称为奥尔森数据库)已过时。真正的Java平台有一个tz数据库,其主机操作系统可能有一个tz数据库。Joda Time有自己的tz数据库。我想安卓也会,虽然我不知道安卓

显然,保持所有这些tz数据库的最新状态是一件非常烦琐的事情

对于Joda Time,只需将Joda Time库替换为最新的。虽然您可以在Joda Time中只替换tz数据库,但据我所知,Joda Time 2实际上没有向后兼容性问题,因此没有理由不更新整个库。但是请阅读发行说明以确定。如果使用Joda时间,这是更新的唯一最低要求;我建议也更新Android、Java和主机操作系统,但这不是必需的

对于真正的Java平台,最新版本使更新tz数据库变得更加容易。以前的版本需要一些黑客攻击。或者,更新到最新的Java8以获得最新的库

对于您的主机操作系统,其常规更新系统可能包含tz更新。但是,其中一些更新可能会滞后。因此,您可能需要进行手动更新

在UTC工作 约会时间工作的最佳实践通常是在中完成所有后端工作。业务逻辑、数据存储、数据库、数据交换等都应使用UTC。调整到时区,例如仅当用户或数据接收器预期/期望时

在Java8和更高版本中,我们将使用内置框架。在UTC中使用
Instant
片刻。指定
ZoneId
以在需要时区时获取
zoneDateTime
。但是Java8技术还没有在Android中提供。我相信有java的后端口库。Android的时候到了,但我不知道细节

对于,请询问UTC的当前时刻

DateTime nowUtc = DateTime.now( DateTimeZone.UTC );
如果您不能相信用户的本地设备/计算机时钟准确且设置正确,则此UTC日期时间将是错误的。对此你无能为力。取而代之的是信任一个外部源,但它假设一个网络连接

根据需要调整到莫斯科时间

DateTime nowMoscow = nowUtc.withZone( DateTimeZone.forID( "Europe/Moscow" ) );
如果用户的Joda Time tz数据库已过期,这将返回错误结果。这是无法避免的,因为你无法预测俄罗斯当局在遵守计时规则的情况下会做什么。唯一的解决方案是使用具有更新tz数据库的Joda时间库更新应用程序。或者,再次信任外部源,例如您的服务器或其他一些web服务,但这假定存在网络连接

从历元验证计数 如果您感到困惑,想要验证日期时间对象的真实值,请查看从-开始的计数

Joda Time和旧的java.util.Date/.Calendar类都从UTC 1970年的第一个时刻开始计算。问题中显示了这些值。看看问题中的历元值的两个毫秒是如何相同的,因此时间轴上的时间相同,但Android的
日期
类对莫斯科时间的调整不正确(几乎可以肯定是因为过时的tz数据库)


请注意,java.time使用不同于历元的计数,从同一历元(1970 UTC)计数。在Joda时间,打电话从epoch获取计数。在java.util.Date中,调用。

您可以找到joda时区(基于上一个IANA)和android系统时区之间的差异:

long diff = DateTimeZone.getDefault().getOffset(yourTimeStapm) - TimeZone.getDefault().getOffset(yourTimeStapm);
您还可以使用系统时区使用的joda时间叉:

我只能通过外部来源的帮助来解决此问题,例如。谢谢,您的想法是正确的。如果epoch的计数是正确的,那么用户的时钟设置是正确的,即使莫斯科的挂钟时间是错误的,因为tz数据库已经过时。解决方案是捆绑Joda Time,使其保持更新,并避免使用旧的Java.util.Date/.Calendar类。另外,我记得有人专门为Android提供了不同包装的Joda Time版本,因为Android的性能限制会导致最初的速度减慢。