日期解析异常

时间:2013-01-30 09:26:23

标签: jodatime

我使用joda在xml中设置日期。我正在使用poi从excelsheet获取日期并使用以下代码在xml中设置它:

DateTimeFormatter fmt = DateTimeFormat.forPattern("EEE, dd MMM YYYY HH:mm:ss zzz")
                  .withLocale(Locale.getDefault());
                   DateTime dt = fmt.parseDateTime(summaryObj.getCreateDateTime().toString());

                   DateTimeFormatter fmt1 = DateTimeFormat.forPattern("dd/MM/yyyy");
                   //get current date only
                   DateTime currentDate = new DateTime();
                   int day = currentDate.getDayOfMonth();
                   int month = currentDate.getMonthOfYear();
                   int year = currentDate.getYear();
                   DateTime dt1 = fmt1.parseDateTime(String.valueOf(day)+"/"+ String.valueOf(month)+"/"+String.valueOf(year));
                listOfPossibleEntities.add("DateOfCreation");
                gc.setTime(dt1.toDate());
                globalContextObj.setDateOfCreation(DatatypeFactory.newInstance()
                        .newXMLGregorianCalendar(gc));

summaryObj.getCreateDateTime()。toString()生成一个字符串,如“Sat Sep 16 05:30:00 IST 2006”。我得到函数parseDateTime()的异常。

java.lang.IllegalArgumentException: Invalid format: "Sat Sep 16 05:30:00 IST 2006" is malformed at " Sep 16 05:30:00 IST 2006"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)
at scanning.ScanningEngine.getGlobalContext(ScanningEngine.java:2633)

我最初直接使用date而不是joda但是我们遇到了jackson deserialiser的异常,同时使用REST将xml作为json返回。这就是我决定切换到joda的原因,因为我看到一些帖子说jackson中有一些bug用于java.util.Date deserialisations。

如果有人知道为什么会出现invalidformat异常,请告诉我。 感谢。

2 个答案:

答案 0 :(得分:0)

如果summaryObj.getCreateDateTime().toString()Sat Sep 16 05:30:00 IST 2006,parseDateTime将为您的格式化程序抛出异常。无法解析“z”(来源:http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html),因此您必须将IST更改为+0530。然后,使用DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z YYYY")修改格式化程序。格式化程序必须类似于喂食字符串。我根据你的例子编写了这段代码,但它确实有用。

String summaryObj = "Sat Sep 16 05:30:00 +0530 2006";
DateTimeFormatter fmt = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z YYYY")
  .withLocale(Locale.getDefault());
DateTime dt = fmt.parseDateTime(summaryObj);

编辑根据kavita的评论,我认为格式化程序的问题需要更好的解释。
您使用的是此格式化程序EEE, dd MMM YYYY HH:mm:ss zzz,但输入字符串看起来像Sat Sep 16 05:30:00 IST 2006,所以

  • SatEEE图案化,这是正确的
  • 逗号不在字符串中,这就是我要求你将其删除的原因
  • Sep正试图通过dd进行图案化,这是几天的模式,这是kavita评论的答案(为什么在这里而不是IST)。 Sep的模式必须为MMM
  • 16代表天数,因此模式为dd
  • 05:30:00表示小时:分钟:秒,模式为HH:mm:ss
  • IST是时区缩写,模式为0 z(请注意,单个z,而不是原始模式中的3个)。不幸的是,它无法解析
  • 2006代表年份,模式YYYY正确

至于另一个问题(如何更改toString的{​​{1}})我不知道是否可能,我建议使用SimpleDateFormatter之类的

Date

答案 1 :(得分:0)

我使用new DateTime(summaryObj.getCreateDateTime());解决了这个问题 这不会给我任何IST或其他例外。