193

この日付を解析しようとしていますが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を取得しましたが、ユーザーが日付を選択したときに取得した日付形式を変更する方法についての指示はありません。

4

5 に答える 5

254

別の形式で設定された SimpleDateFormat で日付を解析することは期待できません。

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

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

これを使用して文字列を日付に解析し、次に他の SimpleDateFormat を使用してその日付を必要な形式に変換します。

        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

于 2009-06-16T01:09:07.243 に答える
52

問題は、日付が次のようにフォーマットされていることです。

Thu Jun 18 20:56:02 EDT 2009

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

yyyy-MM-dd

2 つの形式は一致しません。SimpleDateFormatDate に解析しようとしている文字列のレイアウトと一致する を作成する必要があります。見やすくするために並べると、次のSimpleDateFormatようになります。

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

リンク先のJavaDocページをチェックして、文字がどのように使用されているかを確認してください。

于 2009-06-16T01:08:16.543 に答える
25

現在、この作業を行うためのより現代的な方法があります。

java.time

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

のような 3 ~ 4 文字のコードEDTは、標準化も一意でもないことに注意してください。可能な限りそれらを避けてください。代わりに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" ) );

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

juDate に変換

java.time 型にまだ更新されていないクラスで使用する java.util.Date オブジェクトが本当に必要な場合は、変換してください。割り当てられたタイム ゾーンが失われていることに注意してください。ただし、同じ時刻が自動的にUTCに調整されます。

java.util.Date date = java.util.Date.from( zdt.toInstant() );
于 2015-10-11T01:08:45.527 に答える
12

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

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

コンストラクターに入る文字列は、日付の形式と一致する必要があります。その方法に関するドキュメントはこちらです。「EEE MMM d HH:mm:ss zzz yyyy」に近いものが必要なようです

于 2009-06-16T01:10:59.593 に答える
1

Java で Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México)) を 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);
}
于 2016-09-06T05:29:30.887 に答える