1

我在使用 joda-time 格式化 Parse (parse.com) 存储在 sqlite 表中的日期时间字符串时遇到问题。

Sqlite 创建字符串: “createdDate 日期时间”

将解析日期存储到表中:“插入... parseObject.getCreatedAt()”

如果我然后使用 SQLite 浏览器检查表,我会看到存储的日期如下:

2013 年 6 月 15 日星期六 15:44:52 PDT

因此,我编写了以下代码将其转换回 DateTime 对象,以作为查询的一部分进行解析,以获取比上次插入​​表中的项目更新的项目:

 DateTimeFormatter format = DatetimeFormat.forPattern("yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'");
 DateTime dt = formatter.parseDateTime(datahelper.getLastInsertDate(..));

格式化程序是这样的,因为在 Parse 的数据浏览器中,我可以看到 dateTimes 是这样存储的:

2013-06-24T08:11:45.280Z

我得到了一个 ANR,所以我尝试使用以下格式化程序:

DateTimeFormatter format = DatetimeFormat.forPattern("EEE' 'MMM' 'dd' 'HH':'mm':'ss 'z'' 'YYYY");
DateTime dt = formatter.parseDateTime(datahelper.getLastInsertDate(..));

我仍然得到 ANR。eclipse 中的跟踪显示如下:

原因:java.lang.IllegalArgumentException:无效格式:“Tue Jun 25 00:13:29 PDT 2013”​​在 org.joda.time.format.DateTimeFormatter.parseDateTime”

第二个 ANR 跟踪显示:

格式无效:“Tue Jun 25 00:13:29 PDT 2013”​​在“PDT 2013”​​格式不正确

我已经尝试过解决这个问题,因为 joda time 不会将“z”解析为 PDT/PST,所以我将“PDT”放在我的格式化程序中,希望它能够正常工作,但似乎没有任何效果。

有任何想法吗?

编辑 1:使用接受的答案,我有一个时区格式问题)

DateFormat originalFormat = new SimpleDateFormat("EEE MMM DDD HH:mm:ss z yyyy");
Date originaldate = originalFormat.parse(datahelper.getLastInsertdate);
Log.i("converted date: ", String.valueOf(originalDate);
Log.i("a real date: ", "String.valueOf(new Date(new Date().getTime)));

我得到两个输出:

2013 年 1 月 25 日星期五 15:14:11 PST

2013 年 6 月 25 日星期二 17:11:44 PDT

为什么转换后的日期显示 PST,而标准日期显示 PDT?

4

2 回答 2

0

可悲的是,Joda 无法解析时区名称似乎是一个已知问题。在所有模式语法之前的文档中,您将看到这一行:

模式语法主要与 java.text.SimpleDateFormat 兼容 - 无法解析时区名称,并且支持更多符号。所有 ASCII 字母都保留为模式字母,定义如下:

您可以在此处的文档链接中看到

现在,您的答案的解决方案可以在@BalusC 的这个答案中找到,位于此处

希望这可以帮助。

于 2013-06-25T22:31:56.343 回答
0

我认为使用 SQLite,因为日期类型有些损坏,最好的办法是存储从 Date.getTime() 或相关 Joda 方法获得的 long 。

当您从数据库中获取 long 时,重新构造您的日期对象(例如 new Date(long)),然后对其进行格式化。

最重要的是,请记住(恕我直言)存储日期的唯一明智方法是参考 UTC,这就是您使用 Date.getTime() 和 new Date(long) 得到的:自 1970 年 1 月 1 日 UTC 以来的毫秒数。

检索日期后,请使用适当的时区对其进行格式化。

于 2013-06-26T00:17:58.530 回答