0

jodaを使用してxmlに日付を設定しています。私はpoiを使用してExcelシートから日付を取得し、次のコードを使用して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 の代わりに直接 date を使用していましたが、REST を使用して xml を json として返すときに、jackson デシリアライザーの例外に遭遇しました。これが、java.util.Date デシリアライゼーションの jackson にバグがあるという投稿をいくつか見たので、joda に切り替えることにした理由です。

無効な形式の例外が発生する理由を誰かが知っている場合は、お知らせください。ありがとう。

4

2 に答える 2

0

parseDateTime の場合、フォーマッタで例外がスローされsummaryObj.getCreateDateTime().toString()ます。Sat Sep 16 05:30:00 IST 2006「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)。のパターンSepMMM
  • 16日を表すので、パターンはdd
  • 05:30:00時間:分:秒を表し、パターンはHH:mm:ss
  • ISTはタイムゾーンの略語で、パターンは 0 z(元のパターンのような 3 ではなく単一の であることに注意してくださいz)。残念ながら解析できません
  • 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()); これは、ISTまたはその他の例外を与えません。

于 2013-01-31T04:05:50.543 に答える