joda-time无法读取Parse dateTime字符串

时间:2013-06-25 22:22:10

标签: android parsing jodatime datetime-format

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

Sqlite创建字符串:“createdDate date time”

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

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

  

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

因此,我编写以下内容将其转换回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。日食中的痕迹显示如下:

  

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

第二条ANR追踪显示:

  

格式无效:“2013年2月25日00:13:29 PDT”在“PDT”中格式错误   2013"

我试过解决这个问题,因为joda时间没有将“z”解析为PDT / PST,所以我把'PDT'放在我的格式化程序中以希望它能够正常运行,但似乎没有任何效果。< / p>

有什么想法吗?

编辑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)));

我得到两个输出:

  

1月25日星期五15:14:11太平洋标准时间2013

     

Tue Jun 25 17:11:44 PDT 2013

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

2 个答案:

答案 0 :(得分:0)

这似乎是一个众所周知的问题,Joda无法悲伤地解析Timezone的名字。在所有模式语法之前的文档中,您将看到以下行:

  

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

您可以在文档链接here

中看到

现在,@ BalusC位于here

的答案中可以找到答案的解决方案。

希望这有帮助。

答案 1 :(得分:0)

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

当你从数据库中获取long时,重新构造你的日期对象(例如new date(long)),然后格式化它。

最重要的是,请记住(恕我直言)存储日期的唯一合理方法是参考UTC,这是你用Date.getTime()和新日期(长)获得的:自1970年1月1日以来的毫秒数

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