web-dev-qa-db-ja.com

日付を解析する方法

この日付をSimpleDateFormatで解析しようとしていますが、機能していません。

import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Date;

public class Formaterclass {
    public static void main(String[] args) throws ParseException{
        String strDate = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dateStr = formatter.parse(strDate);
        String formattedDate = formatter.format(dateStr);
        System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
        Date date1 = formatter.parse(formattedDate);

        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        formattedDate = formatter.format(date1);
        System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
    }
}

このコードをstrDate = "2008-10-14"で試してみると、肯定的な答えがあります。どうしたの?どうやってこのフォーマットを解析できますか?

PS。この日付はjDatePickerから取得しました。ユーザーが日付を選択したときに取得する日付形式を変更する方法についての指示はありません。

169
fenec

別の形式で設定されているSimpleDateFormatを使って日付を解析することはできません。

あなたの "Thu Jun 18 20:56:02 EDT 2009"日付文字列を解析するには、(おおよそ)このようなSimpleDateFormatが必要です。

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

これを使用して文字列をDateに解析し、次に他のSimpleDateFormatを使用してそのDateを目的の形式に変換します。

        String input = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(date);

        ...

JavaDoc: http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

227
jwl

問題は、あなたがこのようにフォーマットされた日付を持っているということです:

Thu Jun 18 20:56:02 EDT 2009

しかし、次のようなSimpleDateFormatを使用しています。

yyyy-MM-dd

2つのフォーマットは一致しません。解析しようとしている文字列のレイアウトに合わせて SimpleDateFormat を作成してDateにする必要があります。見やすくするために物事を並べて、あなたはこのようなSimpleDateFormatが欲しいです:

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

私がリンクしているJavaDocページをチェックして、その文字がどのように使われているかを見てください。

50
Eddie

私たちは今、この仕事をするためのもっと近代的な方法を持っています。

Java.time

Java.time フレームワークは、Java 8以降にバンドルされています。 チュートリアル を参照してください。これらの新しいクラスは、 Joda-TimeJSR 31 で定義され、 ThreeTen-Extra プロジェクトで拡張されています。それらは、面倒な古いクラス、Java.util.Date/.Calendarなどを大幅に改善したものです。

EDTのような3〜4文字のコードは、標準化も独自性もありません。可能な限りそれらを避けてください。代わりに ISO 8601 標準フォーマットを使うことを学んでください。 Java.timeフレームワークは翻訳に手間がかかるかもしれませんが、よく使われるコードの多くは重複した値を持っています。

ところで、デフォルトでJava.timeがISO 8601フォーマットを使用して文字列を生成する方法に注意してください。ただし、タイムゾーンの名前を角括弧で追加することによって拡張されています。

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

コンソールにダンプします。

System.out.println ( "zdt : " + zdt );

実行時.

zdt:2009-06-18T20:56:02-04:00 [アメリカ/ニューヨーク]

タイムゾーンを調整する

楽しみのためにインドのタイムゾーンに合わせましょう。

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

zdtKolkata:2009-06-19T06:26:02 + 05:30 [アジア/コルカタ]

J.u.Dateに変換

まだJava.time型に更新されていないクラスで使用するためのJava.util.Dateオブジェクトが本当に必要な場合は、convertをクリックしてください。割り当てられたタイムゾーンを失っていますが、同じ瞬間が自動的に UTC に調整されていることに注意してください。

Java.util.Date date = Java.util.Date.from( zdt.toInstant() );
15
Basil Bourque

getSelectedDate はどうですか?とにかく、特にあなたのコードの質問では、問題はこの行にあります:

new SimpleDateFormat("yyyy-MM-dd");

コンストラクターに入るストリングは、日付の形式と一致しなければなりません。その方法についてのドキュメントは ここ です。 「EEE MMM d HH:mm:ss zzz yyyy」に近いものが必要です。

12
Yishai

Tue Sep 13 2016 00:00:00 GMT-0500(メキシコ)をJavaでdd-MM-yyに変換する方法」に返信して、それはマークされましたどのくらい重複している

これを試してください。Java.util.DateJava.text.SimpleDateFormatを使えば、これは簡単な解決策です。

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

    String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
    Date f = new Date(fecha);

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
    fecha = sdf.format(f);
    System.out.println(fecha);
}
1
Edgar Civil