コードには2つの大きな問題があり、既存の回答はすでにそのうちの1つを解決しています。2番目のさらに危険な問題は、センシティブタイプであるLocale
withを使用しないことです。日時文字列は英語なので、必ずまたは他の英語を使用してください。したがって、正しい初期化は次のようになります。SimpleDateFormat
Locale
Locale.ENGLISH
Locale
SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM d, y", Locale.ENGLISH);
詳細については、[ロケールなしでSimpleDateFormatまたはDateTimeFormatterを使用しない]をオンにしてください。d
また、構文解析のために、月の1桁と2桁の両方の表現に対応できるシングルに注意してください。同様に、1y
つで1年の2桁と4桁の両方の表現に対応できます。
最新の日時APIに切り替えます
java.util
Date-Time APIとそのフォーマットAPISimpleDateFormat
は古く、エラーが発生しやすいことに注意してください。それらの使用を完全に停止し、2014年3月にJavaSE8でリリースされた最新のDate-TimeAPI *に切り替えることをお勧めします。
java.time
最新の日時APIを使用したソリューション
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String input = "Friday, February 1, 2013";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, u", Locale.ENGLISH);
LocalDate date = LocalDate.parse(input, dtf);
System.out.println(date);
}
}
出力:
2013-02-01
ONLINE DEMO
いくつかのメモ:
y
ここでは、の代わりに使用できますu
が、私はを好みu
ますy
。
- は、期待しているのとまったく同じ形式の[ISO-8601形式]を提供します
LocalDate#toString
。したがって、この形式でを取得するために明示的にString
フォーマットする必要はありません。LocalDate
String
Trail: DateTimeから最新のDate-TimeAPIの詳細をご覧ください。
*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIとAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。