1

SimpleDateFormat既知のパターンを使用して、毎秒数千の日付文字列を解析するアプリケーションを想定します。アプリケーションは、そのような各日付パターンにタイムゾーンがあるかどうかを動的に決定する必要があります。つまり、日付パターン文字列のどこかに、引用符なしで大文字Zまたは小文字の文字または が含まれているかどうかX(つまり、合計 4 つの記号) を動的に決定する必要があります。

このような日付パターンの例は次のとおりです。

  • yyyy/MM/dd HH:mm:ss.SSS Z // タイムゾーン (引用符で囲まれていないZ記号)
  • yyyy/MM/dd HH:mm:ss.SSS'Z' // タイムゾーンなし (引用Z符)
  • EEE MMM dd HH:mm:ss x yyyy // タイムゾーン (引用符で囲まれていないx記号)
  • EEE MMM dd HH:mm:ss'x'yyyy // タイムゾーンなし (引用x符)

indexOf()これを行う 1 つの方法は、クラスのメソッドを使用することですStringが、これは、メソッドを各日付パターンで 4 回 (日付パターン文字列が事前に大文字または小文字に変換されている場合は 2 回) 実行し、さらにタイムゾーンが正しいかどうかを確認することを意味します。記号が引用されています (この場合、パターンには実際にはタイムゾーンがありません)。

もう 1 つの選択肢は、次のような Java 正規表現を使用することです。

String date = ... // Get a SimpleDateFormat pattern

Pattern timezone = Pattern.compile("[^ZzXx]+[^'\"][ZzXx]{1}.*");

if (timezone.matcher(date).matches())
{
    // The date pattern does have a timezone
}

上記の正規表現のより高速なバージョンはありますか?

  • "[^ZzXx]+[^'\"][ZzXx]{1}.*"

または、一般に、SimpleDateFormatパターンにタイムゾーン記号が含まれているかどうかを確認するための他のより高速な方法はありますか?

4

1 に答える 1

1

できるだけ簡単にすることをお勧めします:

String string = "...";

Pattern p = Pattern.compile("\\b(?<!')([xXzZ])(?!')\\b");
Matcher m = p.matcher(string);
if (m.find()) {
  String timeZone = m.group(1);
}
于 2012-11-06T01:15:30.203 に答える