6

次のいずれかの形式の日付を解析するための最も良い方法は何ですか

 "dd-MM-yyyy HH:mm"
 "dd/MM/yyyy HH:mm"
 "dd.MM.yyyy HH:mm"

3つのSimpleDateFormatsを作成し、それぞれに対して解析することなく。

ありがとう

4

7 に答える 7

5

最初に2つの置換操作を実行して、3つの形式すべてを1つに減らすことができますか?

于 2009-09-18T09:27:13.423 に答える
5

ソース文字列を標準形式に「微調整」するのがおそらく最も簡単です。

if (text.length() == 16)
{
    if ((text.charAt(2) == '/' && text.charAt(5) == '/') ||
        (text.charAt(2) == '.' && text.charAt(5) == '.'))
    {
        text = text.substring(0, 2) + "-" + text.substring(3, 5) 
           + "-" + text.substring(6);
    }
}

次に、「-」を使用してフォーマット文字列を使用します。

これは非常に具体的であり、不要な副作用を回避するために、関心のある文字を正確に置き換えるだけであることに注意してください。

于 2009-09-18T09:28:49.303 に答える
4

Apache commonslangDateUtils.parseDateを使用できます

import java.text.ParseException;
import org.apache.commons.lang.time.DateUtils;

public class Test {

public static void main(String[] args) throws ParseException {

    String[] values = new String[]{"31-12-2009 12:00", "31/12/2009 12:00", "31.12.2009 12:00"};
    String[] parsePatterns = new String[]{"dd-MM-yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd.MM.yyyy HH:mm"};

    for (String value : values) {
        System.out.println(DateUtils.parseDate(value, parsePatterns));
    }
}
}

さて、内部的にはSimpleDateFormatsを作成しますが、それは何が問題なのですか?

于 2009-09-18T09:40:37.853 に答える
2

java.time

DateTimeFormatter角かっこを使用してオプションのものを指定できるを使用してそれを行うことができます。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.stream.Stream;

public class Main {
    public static void main(String args[]) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d[-][.][/]M[-][.][/]u H:m", Locale.ENGLISH);

        // Test
        Stream.of(
                    "28-04-2021 14:01", 
                    "28.04.2021 14:01", 
                    "28/04/2021 14:01"
        ).forEach(s -> System.out.println(LocalDateTime.parse(s, dtf)));
    }
}

出力:

2021-04-28T14:01
2021-04-28T14:01
2021-04-28T14:01

Trail: DateTimeから最新の日時APIの詳細をご覧ください。

従来の日時API(java.util日時タイプとそのフォーマットAPI SimpleDateFormat)は古く、エラーが発生しやすいことに注意してください。java.timeそれらの使用を完全に停止し、最新の日時API *に切り替えることをお勧めします。


*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。

于 2021-04-28T13:04:24.163 に答える
1

正規表現はどうですか?

"\\d\\d[./-]\\d\\d[./-]\\d\\d\\d\\d \\d\\d:\\d\\d"

コードでは、これは次のような意味になります。

Pattern pattern = 
Pattern.compile("(\\d\\d)([./-])(\\d\\d)([./-])(\\d\\d\\d\\d) (\\d\\d):(\\d\\d)");

Matcher matcher = 
pattern.matcher("31-07-1983 15:30");

if (matcher.find() && matcher.group(2).equals(matcher.group(4))) {
  int day = Integer.parseInt(matcher.group(1));
  int month = Integer.parseInt(matcher.group(3));
  int year = Integer.parseInt(matcher.group(5));
  int hour = Integer.parseInt(matcher.group(6));
  int minute = Integer.parseInt(matcher.group(7));
} 
于 2009-09-18T09:42:35.667 に答える
0

正規表現を使用して自分で行う:

public class SpecialDateFormat
{
    private final static Pattern PATTERN = Pattern.compile("(\\d{2})[\\.\\/\\-](\\d{2})[\\.\\/\\-](\\d{4}) (\\d{2}):(\\d{2})");

    public static Date parse(String text) throws ParseException {
        Matcher m = PATTERN.matcher(text);
        if (m.matches()) {
            int dd = Integer.parseInt(m.group(1));
            int mm = Integer.parseInt(m.group(2));
            int yy = Integer.parseInt(m.group(3));
            int hh = Integer.parseInt(m.group(4));
            int mi = Integer.parseInt(m.group(5));

            // NOTE: Checking if values are in valid ranges omitted

            Calendar cal = Calendar.getInstance();
            cal.set(yy, mm - 1, dd, hh, mi, 0);

            return cal.getTime();
        }
        else {
            throw new ParseException("Unparseable date: " + text, 0);
        }
    }
}

ただし、これにより異なるセパレータを混合できることに注意してください。たとえば、「17-09/200912:00」が許可されます。

于 2009-09-18T10:05:05.280 に答える
-3

ParseExactは、さまざまな形式をとることができます。それでもすべての形式を指定する必要がありますが、それは単一の操作です。

于 2009-09-18T09:32:05.887 に答える