0

我正在使用 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)

我最初直接使用日期而不是 joda,但是我们在使用 REST 将 xml 作为 json 返回时遇到了杰克逊反序列化器的异常。这就是我决定切换到 joda 的原因,因为我看到一些帖子说 jackson 中有一些用于 java.util.Date 反序列化的错误。

如果有人知道为什么会出现无效格式异常,请告诉我。谢谢。

4

2 回答 2

0

If summaryObj.getCreateDateTime().toString()is Sat Sep 16 05:30:00 IST 2006parseDateTime 将与您的格式化程序引发异常。'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,所以

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

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

DateFormatter formatter = new SimpleDateFormatter("EEE MMM dd HH:mm:ss Z YYYY");
String date = formatter.format(summaryObj.getCreateDateTime());
DateTimeFormatter fmt = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z YYYY")
    .withLocale(Locale.getDefault());
DateTime dt = fmt.parseDateTime(date);
于 2013-01-30T11:23:06.230 回答
0

我通过使用new DateTime(summaryObj.getCreateDateTime()); This 解决了这个问题,这并没有给我任何 IST 或其他方面的例外。

于 2013-01-31T04:05:50.543 回答