Android 如何获取包含当前时间的两个日期对象,一个在GMT中,另一个在本地

Android 如何获取包含当前时间的两个日期对象,一个在GMT中,另一个在本地,android,date,datetime,Android,Date,Datetime,我尝试填充两个日期对象,一个是本地时间,另一个是UTC时间 我不想在GMT/UTC中将日期打印为字符串,请不要建议使用日期格式,在阅读完整问题之前不要重复 在当地,我没有问题: Date dateLocal = new Date(); 问题是我无法将utcDate设置为UTC 使用这样的日历: TimeZone utcTimeZone = TimeZone.getTimeZone("UTC"); Calendar c = new GregorianCalendar(); c

我尝试填充两个日期对象,一个是本地时间,另一个是UTC时间

我不想在GMT/UTC中将日期打印为字符串,请不要建议使用日期格式,在阅读完整问题之前不要重复

在当地,我没有问题:

Date dateLocal = new Date();
问题是我无法将utcDate设置为UTC

使用这样的日历:

TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
Calendar c = new GregorianCalendar();
c.setTime(new Date());
c.setTimeZone(TimeZone.getTimeZone(utcTimeZone.getID()));
Date utcDate = c.getTime();
调试或提交到Web服务时,utcDate显示在我的本地时区,而不是UTC

使用Joda:

DateTime utcDateTime = DateTime.now(DateTimeZone.UTC);
Date utcDate = utcDateTime.toDate();
同样的问题,utcDate在调试/提交到webservice时在当地时间显示

以下是调试对象时的外观:

这是一个问题,因为这会导致Web服务(我没有访问权限)认为这个时间是UTC,所以当它进行工作和转换时,时间总是缩短4小时,因为对我来说UTC到本地的转换是GMT-4

我能够以UTC时间提交日期的唯一方法是添加:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
但这也会更改LocalTime对象,即使该对象是在更改默认时区之前定义和设置的


所以我明白了,Date()对象使用JVM语言环境,所以任何时候创建一个日期,它都是在默认时区中创建的,显然,每当默认时区被更改时,所有的日期对象(即使它们已经创建)都会更改为新的默认时区。。。我知道日期对象在现在和1970年之间只是毫秒,但很明显,在Web服务中,时区被考虑进去了,这会弄乱我的结果……我如何才能得到我想要的日期?

Java
Date
对象甚至没有时区,它们只是一个抽象的时间点。您可能需要使用
日历
,或者点击更新的Java 8 date API来做您想在这里做的事情(我想)。要想借助@TimBiegeleisen所说的,您可以预期
日期
对象只在内部存储UTC时间,不携带时区信息。您在调试器中看到EDT时间的原因是
Date.toString()
函数在创建字符串时添加了来自设备时区设置的信息。可能重复,事实上,之前已经询问并回答过。您真正需要的是一个(或者更确切地说是两个)ZoneDateTime。您可以通过backport在非全新Android上使用java.time。如果您没有将
日期
格式化为字符串,如何将其提交到web服务?当然,有一种方法可以给web服务提供正确的时间,您只是没有给我们足够的信息让我们告诉您如何进行。顺便说一句,
Date
类早已过时,设计也很糟糕,对于
Calendar
TimeZone
也是如此。而不是考虑JavaTimes。