【问题标题】:Android Date Timezones driving me nutsAndroid 日期时区让我抓狂
【发布时间】:2011-05-20 14:24:44
【问题描述】:

我有一个与 GPS 模块和 SQLite 数据库配合使用的 Android 应用程序。一开始一切听起来都很好,但是当我需要使用 Date() 和时区时,恐惧就来了。

一点背景

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

我的工作 在 LocationListener 中从 GPS 获取数据:

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

默认情况下,通过 new Date() 将 GPS 日期转换为设备的当前时区。因此,我没有享受 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 格式的日期、插入、转换、比较、计算差异。只有当我需要向他展示时,我才需要用户时区中的日期。

请照亮我。

【问题讨论】:

  • 如果您只是要将 DATE 对象放入数据库,为什么还需要它。只需输入您从 location.getTime() 获得的时间
  • 嗯,这是一个强项...我会尝试看看它是如何工作的。
  • 有些东西没有加起来,myStartDate 是一个日期,在这里你只显示部分代码,当你说“显示”时,它作为日期显示你是什么意思?在调试器中? ins system.out.println?如果您这样做,我很确定即使您将日期本身解析为 GMT,日期默认首选项仍以设备格式显示,如果您希望它以您的时间格式显示,您必须创建另一种日期格式并将其时区设置为 GMT .

标签: java android date timezone


【解决方案1】:

问题似乎是您没有存储时区。您自己说过,当从您存储它的任何地方检索 myStored 时,它会在没有 TZ 的情况下返回。然后,当您对其调用 parse 时,您会强制它使用 GMT。由于格林威治标准时间与您当地的时区相差 2 小时,因此时间会相差 2 小时。

简而言之,您应该能够利用卫星时间,使用带有 z 或 Z 选项的 simpledateformat 将输出格式化到您存储它的任何位置。您甚至根本不应该使用 setTimezone 方法。然后使用与以前相同的日期格式化程序,而不是新的日期格式化程序来解析您存储它的传入日期。

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2010-11-19
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2014-05-19
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多