日付を解析するにはどうすればよいですか?[重複]
-
14-09-2019 - |
質問
この質問にはすでに答えがあります:
- Java 文字列から日付への変換 13 件の回答
この日付を解析しようとしています 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
ユーザーが日付を選択したときに取得する日付形式を変更する方法についての指示はありません。
解決
あなたは別のフォーマットで設定されてSimpleDateFormatと日付を解析するために期待することはできません。
あなたは、このようなてSimpleDateFormatを必要とするあなたの「木6月18日午後8時56分02秒EDT 2009」の日付文字列を解析するには(およそ):
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 /のJava SE / 7 /ドキュメント/ API / Javaの/テキスト/ SimpleDateFormat.html の
他のヒント
問題は、あなたがこのようにフォーマットされた日付があるということです
Thu Jun 18 20:56:02 EDT 2009
しかし、あるSimpleDateFormat
を使用しています:
yyyy-MM-dd
二つのフォーマットが一致していません。あなたは一致する SimpleDateFormat
に構築する必要がありますあなたが日付に解析しようとしている文字列のレイアウト。見て、それは簡単にするために、物事を並べ、あなたがこのようなSimpleDateFormat
が欲しいます:
EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009
私はにリンクされているJavaDocのページをチェックして、文字が使用されている方法を見ます。
この作業を行うためのより現代的な方法が登場しました。
java.time
の java.time フレームワークは Java 8 以降にバンドルされています。見る チュートリアル. 。これらの新しいクラスは、 ジョーダタイム, 、 によって定義されます JSR 310, 、によって拡張されます ThreeTen-Extra プロジェクト。これらは、面倒な古いクラスである java.util.Date/.Calendar などに比べて大幅に改善されています。
次のような 3 ~ 4 文字のコードに注意してください。 EDT
標準化されておらず、独自でもありません。可能な限りそれらを避けてください。使い方を学ぶ ISO8601 代わりに標準フォーマットを使用します。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[アジア/コルカタ]
ju 日付に変換する
まだ java.time 型に更新されていないクラスで使用する java.util.Date オブジェクトが本当に必要な場合は、変換してください。割り当てられたタイムゾーンは失われますが、同じ時刻が自動的に調整されることに注意してください。 UTC.
java.util.Date date = java.util.Date.from( zdt.toInstant() );
どの程度 getSelectedDate >?とにかく、特にあなたのコードの問題について、問題は、この行を次のとおりです。
new SimpleDateFormat("yyyy-MM-dd");
コンストラクタで行くの文字列は、日付の書式と一致する必要があります。それを行う方法のドキュメントはこちらあるに。あなたが近いものを必要とするように見えると "EEE MMM dはHH:MM:SSのZZZのYYYY"
への返信です。 "の火2016年9月13日00:00:00 GMT-0500を変換する方法(ホラ・デ・VERANO中央(メキシコ))DD-MM-YYをするためにJavaで?が"、それがマークされたか、重複
これを試してみてください。
java.util.Date
、java.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);
}