5

Javaでこの変換を実行するにはどうすればよいですか?

現在、私は次のことを行っています。

public static String formatDate(String strDateToFormat) {
    try {
        SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM DD, YYYY");
        Date date = sdfSource.parse(strDateToFormat);
        SimpleDateFormat sdfDestination = new SimpleDateFormat("yyyy-MM-dd");
        return sdfDestination.format(date);
    } catch (ParseException pe) {
        System.err.println("Parse Exception : " + pe);
    }

    return null;
}

ただし、これにより形式が正しくなくなります。次の出力が得られます。

Friday, February 1, 2013 > 2013-01-04
Thursday, January 31, 2013 > 2013-01-03
4

3 に答える 3

9

DD1年の日である解析部分で使用しています。dd代わりに必要です。また、おそらく(週yyyyの年)ではなく(年)が必要です。YYYY(ほとんどの場合、これらは同じ値ですが、常にではありません。)

于 2013-02-03T20:48:58.420 に答える
3

1年の日である解析部分でDDを使用しています。代わりにddが必要です。yyyyのYYYYも変更します。

ここですべてのパターンを見つけることができます。

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

于 2013-02-03T20:54:34.750 に答える
2

コードには2つの大きな問題があり、既存の回答はすでにそのうちの1つを解決しています。2番目のさらに危険な問題は、センシティブタイプであるLocalewithを使用しないことです。日時文字列は英語なので、必ずまたは他の英語を使用してください。したがって、正しい初期化は次のようになります。SimpleDateFormatLocaleLocale.ENGLISHLocale

SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM d, y", Locale.ENGLISH);

詳細については、[ロケールなしでSimpleDateFormatまたはDateTimeFormatterを使用しない]をオンにしてください。dまた、構文解析のために、月の1桁と2桁の両方の表現に対応できるシングルに注意してください。同様に、1yつで1年の2桁と4桁の両方の表現に対応できます。

最新の日時APIに切り替えます

java.utilDate-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

いくつかのメモ:

  1. yここでは、の代わりに使用できますuが、私はを好みuますy
  2. は、期待しているのとまったく同じ形式の[ISO-8601形式]を提供しますLocalDate#toString。したがって、この形式でを取得するために明示的にStringフォーマットする必要はありません。LocalDateString

Trail: DateTimeから最新のDate-TimeAPIの詳細をご覧ください。


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

于 2021-06-08T17:13:50.420 に答える