6

形式を指定せずに文字列を POJO に解析できる Java ライブラリを探しています。POjavaを調査しました。同様のことを行う他のライブラリはありますか?

DateTime dateTime = DateTimeParser.parse("21/02/13");

//If unclear use the cultural information passed
DateTime dateTime = DateTimeParser.parse("01/02/13", new Locale("en-us"));

//Should also work with time zones
DateTime dateTime = DateTimeParser.parse("2011/12/13T14:15:16+01:00");

同じ問題のIntelligent date / time parser for Javaを含む次のリンクを見つけましたが、あまり有用な回答ではありません。Joda も JChronic も、私が望んでいたことをしません。私が間違っている場合は修正してください。

アップデート:

Joda が私の目的を解決しないと私が言う理由は、Joda は文字列が ISO8601 形式または "yyyyMMdd" のように指定した任意の形式で解析されることを期待しているためです。複数のフォーマットを処理する必要があるため、このフォーマットをハードコーディングすることはできません。

アメリカまたはヨーロッパの日付形式、つまり mm/dd/yy または dd/mm/yy に関するあいまいさを解消するためのハック ソリューションがあります。日付のタイムゾーンにアクセスできると仮定すると、それがアメリカ形式かヨーロッパ形式かを判断できますか? 誰かがこれを行う方法を教えてもらえますか? ググったが何も見つからなかった。

4

7 に答える 7

9

問題は、正しく推測できない形式がいくつかあることです。

簡単な例は次のとおりです01/02/2013。これは2月1日ですか、それとも1月2日ですか。またはさらに悪いことに: 01/02/09?

両方の形式が存在します。(ありがとう、英国と米国!)

そのため、形式を推測する人は、これらの形式については運に頼るか、故意に失敗する必要があります。

Python モジュールdateutil.parserは、ベスト エフォート パーサーの例として役立ちます。申し訳ありませんが、Java に相当するものを知りません。しかし、 Joda Timeを見たいと思うかもしれません。

http://labix.org/python-dateutil#head-b95ce2094d189a89f80f5ae52a05b4ab7b41af47

実際にはパラメータdayfirstとがありますyearfirst

次に、perl モジュールがあります。

https://metacpan.org/pod/Time::ParseDate

そのモジュールの優先順位リストを使用できる場合があります。やみくもに多くのパターンを試すのはそれほど速くはありませんが (最適化されたレクサーの方がはるかに高速です)、何百万ものレコードのフォーマットを推測しているのでない限り、それで十分かもしれません。

于 2013-02-21T19:07:03.587 に答える
4

私は自分の問題に対する答えを見つけました。この特定のライブラリPOjavaを使用しました。このページでは、形式を指定せずに日付と時刻の文字列をフォーマットする方法について説明します。ただし、ライブラリが適切に機能するためには、日の後に月が続く、または月の後に日が続くなど、日付の順序を指定する必要があります。

于 2013-02-28T16:26:09.957 に答える
1

私の状況では便利な解決策が見つからなかったので、簡単な静的ユーティリティ メソッドを作成しました。フォーマットをコレクションにラップし、それを繰り返し処理することで、さらに多くのフォーマットが追加された場合に作業が簡単になる可能性があります。

public static Date returnDateFromDateString(String propValue) throws Exception {

    SimpleDateFormat sdfFormat1 = new SimpleDateFormat(IDateFConstants.DATE_STRING_FORMAT_1);
    SimpleDateFormat sdfFormat2 = new SimpleDateFormat(IDateFConstants.DATE_STRING_FORMAT_2);
    SimpleDateFormat sdfISO8601 = new SimpleDateFormat(IDateFConstants.DATE_STRING_ISO_8601);

    try {
        return sdfFormat1.parse(propValue);
    } catch (ParseException e) { }

    try {
        return sdfFormat2.parse(propValue);
    } catch (ParseException e) { }

    try {
        return sdfISO8601.parse(propValue);
    } catch (ParseException e) { }

    throw new Exception(IDateFConstants.DATE_FORMAT_ERROR);
}

どこにIDateFConstants見える

public interface IDateFConstants {

public static final String DATE_STRING_ISO_8601 = "yyyy-MM-dd'T'HH:mm:ss";
public static final String DATE_STRING_FORMAT_1 = "dd.MM.yyyy";
public static final String DATE_STRING_FORMAT_2 = "dd.MM.yyyy HH:mm:ss";

public static final String DATE_FORMAT_ERROR = "Date string wasn't" + 
                                            + "formatted in known formats";

}
于 2016-10-04T14:46:38.833 に答える
1

これに対する魔法の解決策はありません。日付/時刻の形式は、ロケールによっても異なる場合があることに注意してください。

現実的にできる最善の方法は、フォーマットのリストを定義し、適合するもの (または存在しないもの) が見つかるまで、それらを 1 つずつ「試行」することです。

private static final FORMAT_1 = "MM/dd/yyyy'T'HH:mm:ss.SSS"
private static final FORMAT_2 = "MM/dd/yyyy'T'HH:mm:ss"
private static final FORMAT_3 = "MM/dd/yyyy"

Java で日付/時刻オブジェクトを操作するときは、スレッドの安全性について考慮することを忘れないでください。「ThreadSafeDateTimeFormatter」という名前のこの種のことを行うクラスがあります。

幸運を!

于 2013-02-21T19:11:51.283 に答える