java – Android Date Timezones让我疯狂

我有一个适用于GPS模块和SQLite数据库的
Android应用程序.一开始听起来一切都很好,但是当我需要使用Date()和timezones时,恐怖就出现了.

一点背景

GPS模块可以从卫星获取日期.这是一件好事,我需要在我的应用程序中确保有效的数据.从它返回的日期是GMT时间.
此日期作为StartTime插入本地数据库的字段中. StartTime使用AES加密存储.当我解密StartTime时,我需要将其转换为Date并将格式保持为GMT.

我所做的
在LocationListener中从GPS获取数据:

gpsDate = new Date(location.getTime());

通过默认使用新的Date(),GPS日期将在设备的当前时区中转换.因此,2010年格林威治标准时间2010年10月5日16:00:00 GMT 2将于2010年10月5日星期五格林威治标准时间开始,而不是在2010年10月5日星期四.我只是想从getTime()中获取一个新的Date.

我在数据库中插入数据:

SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
outputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
String date = outputFormat.format(gpsDate);

我需要时检索日期:

SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
outputFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String myStored = {decrypy from the database}
Date myStartDate = outputFormat.parse(myStoredDate);

myStored显示:2010-12-05 14:00

myStartDate显示:2010年2月5日16:00:00 GMT 2 2010

我在这里缺少一些东西.我需要能够以GMT格式获取日期,插入,转换,比较,计算差异.只有当我需要向他展示时,我才需要用户时区中的日期.

请照亮我.

最佳答案 问题似乎是您没有存储时区.你自己说过myStored,当你从存储它的任何地方检索到它时,它会在没有TZ的情况下返回.然后,当你对它进行解析时,强制它使用GMT.由于格林尼治标准时间与当地时区的2小时不同,所以时间不同2小时.

简而言之,您应该能够获取卫星时间,使用带有z或Z选项的simpledateformat将输出格式化为存储它的位置.你根本不应该使用setTimezone方法.然后使用与以前相同的dateformatter,而不是新的,以解析存储它的传入日期.

完成此操作后,在将输出发送给用户之前,请确定其时区,然后在您拥有的数据上设置时区.

点赞