2010-12-05 59 views
4

我有一个Android应用程序,可以使用GPS模块和SQLite数据库。在开始时,一切都听起来很不错,但是当我需要使用Date()和时区时,恐怖就会出现。Android Date Date Timezones驱动我坚果

一点背景

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

我做什么 获取LocationListener的从GPS数据:具有默认的GPS日期转换在设备的当前时区新的Date()

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

。因此,我没有一个不错的Sun Dec 05 14:00:00 GMT 2010 time,我得到Sun Dec 05 16:00:00 GMT + 2 2010。它为什么这样做?我只是想从getTime()中取出一个新日期。

我插入数据在数据库:

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显示:Sun Dec 05 16:00:00 GMT + 2 2010

这里有一些我很想念的东西。我需要能够以格式获取日期,插入,转换,比较,计算差异。只有当我需要显示给他时,我需要用户时区中的日期。

请照亮我。

+1

为什么你需要一个DATE对象,如果你只是想把它放在数据库中。只要把你从location.getTime() – Falmarri 2010-12-05 20:28:17

+0

得到的时间,这是一个很好的点...我会尝试看看它是如何工作的。 – Alin 2010-12-05 20:52:45

回答

2

该问题看起来是,您没有存储时区。您自己说过,myStored在从您存储的任何位置进行检索时会返回,而无需TZ。然后,当你对它进行解析时,你强迫它使用GMT。由于格林尼治标准时间与当地时区有2小时不同,因此时间有2小时不同。

简而言之,您应该可以使用sattelite时间,使用带有z或Z选项的simpledateformat将输出格式化为存储它的任何位置。你甚至不应该使用setTimezone方法。然后使用与以前相同的dateformatter,而不是一个新的,从您存储它的位置解析传入的日期。

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