我有一个适用于GPS模块和SQLite数据库的Android应用。一开始听起来很棒,但是当我需要使用Date()和时区时,恐怖就会出现。
一点背景
GPS模块可以从卫星获取日期。这是一件好事,我需要在我的应用程序中确保有效的数据。从它返回的日期是GMT时间。 此日期作为StartTime插入本地数据库的字段中。 StartTime使用AES加密存储。当我解密StartTime时,我需要将其转换为Date并将格式保持为GMT。
我做什么 在LocationListener中从GPS获取数据:
gpsDate = new Date(location.getTime());
默认情况下使用新的Date(),GPS日期将在Device的当前时区转换。因此,我没有一个好的 Sun Dec 05 14:00:00 GMT 2010 时间,而是 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
我在这里缺少一些东西。我需要能够以GMT格式获取日期,插入,转换,比较,计算差异。只有当我需要向他展示时,我才需要用户时区中的日期。
请照亮我。
答案 0 :(得分:2)
问题似乎是您没有存储时区。你自己说过myStored,当你从存储它的任何地方检索到它时,它会在没有TZ的情况下返回。然后,当你对它进行解析时,强制它使用GMT。由于格林尼治标准时间与当地时区的2小时不同,所以时间不同2小时。
简而言之,您应该能够获取卫星时间,使用带有z或Z选项的simpledateformat将输出格式化为存储它的位置。你根本不应该使用setTimezone方法。然后使用与以前相同的dateformatter,而不是新的,以解析存储它的传入日期。
完成此操作后,在将输出发送给用户之前,请确定其时区,然后在您拥有的数据上设置时区。