0

多くの形式の日付/時刻をチェックして、処理できるように有効な日付/時刻かどうかを確認できるものを作成しようとしています。それを処理することは、日付/時刻を私のソフトウェアが動作するように正規化されたものに変換することから成ります。問題は、SimpleDateFormat で日付を検出するためにさまざまな方法でチェックを行う必要があることですが、すべての種類を取得するのは非常に困難でした。このプロジェクトは、日付列にユーザーが指定した可能性のある日付形式を含む CSV ファイルの解析に関連しています。より良い方法はありますか?これが私が今していることです:

public static boolean isDateValid(String dateString)
{
    ArrayList<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>();

    dateFormats.add(new SimpleDateFormat("M/dd/yyyy"));
    dateFormats.add(new SimpleDateFormat("dd.M.yyyy"));
    dateFormats.add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("dd.M.yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("dd-M-yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("M-dd-yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("yyyy-M-dd hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("dd.MMM.yyyy"));
    dateFormats.add(new SimpleDateFormat("dd-MMM-yyyy"));
    dateFormats.add(new SimpleDateFormat("M/dd"));
    dateFormats.add(new SimpleDateFormat("M dd"));
    dateFormats.add(new SimpleDateFormat("M y"));
    for (SimpleDateFormat format : dateFormats) 
    {
        try 
        {
            format.setLenient(false);
            Date date = format.parse(dateString);
            return true;
        } 
        catch (Exception e) 
        {

        }
    }
    return false;
}

さらに、Apache Commons の DateUtils も使用してみましたが、まだ一連の日付を循環する必要があるようです。

public static boolean isDate(String dateString)
{
    try
    {
        Date theDate = DateUtils.parseDate(dateString);
    }
    catch (Exception e)
    {
        System.out.println(e);
        return false;
    }
    return true;
}

アイデアや励ましの言葉はありますか?

4

3 に答える 3

0

現在のアプローチの問題の 1 つは、SimpleDateFormat のインスタンスを 1 つだけ使用することがわかっている場合に、それらすべてのインスタンスを不必要に作成していることです。代わりに、正規表現を使用して、受け取った日付文字列の種類を検出し、次の 2 つのいずれかを実行します。一般的なフォーマッタ。

于 2013-04-20T01:33:38.357 に答える
0

さて、ここに私の提案があります:

  1. サポートされている日付形式の種類を絞り込む必要があります。あらゆる種類の日付形式をサポートするのはクレイジーです。たとえば、一九九零年三月一日は中国語で有効な日付形式です。

  2. また、次のように有効な日付を検出するための二重チェック方法があります。

    public boolean isDate(String dateStr, DateFormat format){
        boolean result = false;
        try
        {
            Date date = format.parse(dateStr);
            if (format.format(date).equals(dateStr))
            {
                result = true;
            }
        } catch (Exception e)
        {
            result = false;
        }
        return result;
    }
    

'2013/4/31' は SimpleDateFormat で '2013/5/1' に変換されるので、4 月の最後の日は 30 日ですよね?

于 2013-04-20T02:22:48.037 に答える