1

我正在开发的基于时间的应用程序遇到了一些问题,该应用程序在 Android 客户端使用 Java,在服务器端使用 Python。在 Java 和 Python 报告的时间中,我遇到了 -3 小时的差异(这正是 Android 设备的时区),即使在双方我都以某种方式获得时间(根据 SO 和其他网站) 返回一个 UTC 时间。在我的客户中,我正在使用

Date utcNow = new Date()

在服务器中,我使用

datetime.datetime.now()

然而,当同时运行时,它们分别产生2013-09-09 11:52:162013-09-09 14:52:16。我怀疑问题出在 Java 方面,因为date在服务器中运行返回与 Python 相同的值(显然),使用时区 UTC,并且 Android 设备中的相同命令返回 BRT (GMT-3) 时间。

在搜索两种语言的时区调整时,所有答案都声称上述方法将返回 UTC 日期,但这种差异清晰可见。

如何将 Android 设备的时间转换为 UTC?

现在我正在使用一个非常丑陋(并且非常不推荐)的解决方案:utcNow.setHours(utcNoe.getHours()+3)

编辑:旁注:从乔恩的回答中,我注意到 Java 的Date对象等同于 Python 的天真datetime对象。

4

2 回答 2

8

我强烈怀疑问题出在您没有向我们展示的代码中 - 当DateString通过SimpleDateFormat.

ADate本身只是一个瞬间,没有与之关联的时区或日历系统。为了将其转换为字符串,两者都需要应用 - 并且 a 中的默认时区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,您可能会过得更好。(如果您只需要一个时间戳,那将是矫枉过正,但如果您有任何实际的日期/时间工作要做,您绝对应该考虑它。)

于 2013-09-09T15:12:48.843 回答
1

This has been asked many times before. Have a look at Set Time Zone. You can also use this approach to change the timezone.

--- EDIT If you want to transmit your timezone as a string, you should transmit it using ISO_8601 that way you can adjust the time on your server.

于 2013-09-09T15:08:56.790 回答