【问题标题】:joda-time can't read Parse dateTime stringjoda-time 无法读取 Parse dateTime 字符串
【发布时间】:2013-06-25 22:22:09
【问题描述】:

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

Sqlite 创建字符串:"createdDate date time"

将解析日期存储到表中:"insert... 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中的trace显示如下:

原因: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?

【问题讨论】:

标签: android parsing jodatime datetime-format


【解决方案1】:

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

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

您可以在文档链接中看到here

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

希望这会有所帮助。

【讨论】:

  • 已接受。我不知道这个限制(我知道了,但我想也许我可以通过将时区转义为“PDT”来绕过它,但这不起作用)。我真的希望不必包括两种类型的日期方法,因为 joda-time 似乎更有效,但我想我别无选择。谢谢!
  • 其实这有点行不通。请查看已编辑的主题
  • 尝试在 SimpleDateFormat 的构造函数中指定语言环境,例如。 new SimpleDateFormat("EEE MMM DDD HH:mm:ss z yyy",Locale.US);
【解决方案2】:

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

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

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

检索日期后,将其格式化为合适的时区。

【讨论】:

  • 感谢您存储日期的想法。有趣的是,我尝试只提交一个常规的“日期”对象来解析,但它似乎也不起作用。我已经与我正在为其开发应用程序的健身房的所有者进行了交谈,我们已经确定我们需要传输的数据量非常低(每天一次不到 30KB),所以我们已经决定每次打开应用程序时只清空表并获取所有记录,因为我们最多只能查看 100 行。不过,我需要继续查看 Parse 的文档,因为他们访问数据的某些方式令人困惑。
猜你喜欢
  • 2023-04-09
  • 2011-05-23
  • 2015-01-24
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多