我在开发基于时间的应用程序时遇到了一些问题,该应用程序在 Android 客户端使用 Java,在服务器端使用 Python。我在 Java 和 Python 报告的时间中遇到了 -3 小时的差异(这正是 Android 设备的时区),即使在双方我都以某种方式获得时间(根据 SO 和其他网站) ) 返回 UTC 时间。 在我的客户中,我正在使用
Date utcNow = new Date()
在服务器中,我使用
datetime.datetime.now()
然而,当同时运行时,它们会产生 2013-09-09 11:52:16
和 2013-09-09 14:52:16
,分别。我怀疑问题出在 Java 方面,因为在服务器中运行 date
返回与 Python 相同的值(显然),时区为 UTC,而 Android 设备中的相同命令返回 BRT(GMT -3) 时间。
在搜索两种语言的时区调整时,所有答案都声称上述方法将返回 UTC 日期,但这种差异是显而易见的。
如何将 Android 设备的时间转换为 UTC?
现在我正在使用一个非常丑陋(并且极度不推荐使用)的解决方案:utcNow.setHours(utcNoe.getHours()+3)
编辑:旁注:从 Jon 的回答中,我注意到 Java 的 Date
对象等同于 Python 的原始 datetime
对象。
最佳答案
我强烈怀疑问题出在您未向我们展示的代码中 - 当您转换 Date
时到 String
在 Java 中通过 SimpleDateFormat
.
A Date
本身只是一个瞬间,没有与之关联的时区或日历系统。为了将其转换为字符串,两者都需要应用 - 以及 SimpleDateFormat
中的默认时区是系统本地时区。
如果您只是将代码更改为:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateText = format.format(date);
然后我怀疑你的问题会消失。请注意,这不是 Date
的一部分信息本身。 (了解这一点非常重要。)
另请注意,Java 中的日期/时间 API 非常糟糕。如果你能使用Joda-Time相反,您可能会玩得更开心。 (如果您只需要一个时间戳,那就太过分了,但是如果您有任何实际的日期/时间工作要做,您绝对应该考虑一下。)
关于java - Python 与 Java UTC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701348/