我遇到了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?
答案 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日以来的毫秒数
检索完日期后,请使用适当的时区对其进行格式化。