データベースにString
があります(match.getDate
)次の日付形式です:
2018年1月4日
これはフォーマットしたい日付で、日/月/年として保存されます。これを私のAndroidアプリ用にフォーマットします。
日付を次の形式にしたい:
2018年4月1日
以下の私のコード:
SimpleDateFormat fDate = new SimpleDateFormat("dd/MM/yyyy");
try {
textViewDate.setText(fDate.parse(match.getDate()).toString());
} catch (ParseException ex) {
System.out.println(ex.toString());
}
これは出力します:
2018年4月8日(日)00:00:00 GMT + 00:00.
私も試しました"EE, MM d, yyyy"
、しかしそれは私に与えます:
Java.text.ParseException:解析できない日付:「2018年4月1日」
私が作成したこの日付フォーマッタメソッドを使用する
public static String dateFormater(String dateFromJSON, String expectedFormat, String oldFormat) {
SimpleDateFormat dateFormat = new SimpleDateFormat(oldFormat);
Date date = null;
String convertedDate = null;
try {
date = dateFormat.parse(dateFromJSON);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(expectedFormat);
convertedDate = simpleDateFormat.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return convertedDate;
}
このメソッドを次のように呼び出します
dateFormater(" 01/04/2018" , "EE dd MMM yyyy" , "dd/MM/yyyy")
そして、あなたは望ましい出力を得るでしょう
他の答えはあなたの問題を解決しました、しかし私はいくつかの概念とあなたの最初の試みがうまくいかなかった理由を知ることは重要だと思います。
dateとdateを表すテキストには違いがあります。
例:今日の日付は2018年3月9日です。その日付は単なる概念であり、「カレンダーシステムの特定のポイント」のアイデアです。
ただし、同じ日付を多くの形式でrepresentedにすることができます。これは、「グラフィック」の場合もあれば、紙の数字の周りに特定の順序で他の多くの数字が並んだ円の形の場合もあれば、次のようなプレーンテキストの場合もあります。
テキスト表現は異なりますが、すべて同じ日付(同じ値)を表すことに注意してください。
それを念頭に置いて、Javaがこれらの概念でどのように機能するかを見てみましょう。
String
で表されます。このクラスには、一連の文字のみが含まれます。これらの文字は何でも表すことができます。この場合、それは日付ですJava.util.Date
_で表現され、次に_Java.util.Calendar
_で表現されましたが、 これらのクラスには問題が多い であり、可能であればそれらを避ける必要があります。 今日は、そのためのより良いAPIがあります 。Androidでは、使用しているAPIレベルで_Java.time
_クラスが使用可能な場合はそれを使用できます。それより低いAPIレベルの場合は threeten backport ( こちらの方法を確認)使用してください )。日付を処理するためのより簡単で信頼性の高いツールがあります。
あなたの場合、String
(日付を表すテキスト)があり、それを別の形式に変換したいとします。次の2つの手順で行う必要があります。
String
を特定の日付タイプに変換します(テキストを日/月/年の数値に変換します)。これは解析と呼ばれますあなたの試みがうまくいかなかった理由:
Date::toString()
method を呼び出したため、最初の試行で誤った形式が返されました。これは、その形式(_Sun Apr 08 00:00:00 GMT+00:00 2018
_)で出力(テキスト表現)を生成するため、解析正しかったが、フォーマットは正しくなかったEE dd MMM yyyy
_、フォーマットに使用する必要があるもの)を使用して日付を解析しました(これによりParseException
が発生しました)。ステップ1では、LocalDate
を使用できます。これは、日付(日、月、年、時間なし、タイムゾーンなし)を表すタイプです。これが入力です。
_String input = "01/04/2018";
DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// parse the input
LocalDate date = LocalDate.parse(input, inputParser);
_
古いAPIの 奇妙なバグや問題がたくさん を解決するため、SimpleDateFormat
よりも信頼性が高くなります。
LocalDate
オブジェクトができたので、ステップ2を実行できます。
_// convert to another format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EE dd MMM yyyy", Locale.ENGLISH);
String output = date.format(formatter);
_
_Java.util.Locale
_を使用したことに注意してください。これは、必要な出力に英語の曜日と月の名前が含まれているためであり、ロケールを指定しない場合は、JVMのデフォルトが使用されます(誰が常に英語であることを保証しますか?デフォルトの構成に依存する代わりに使用しているAPI。これらは、同じJVMで実行されている他のアプリケーションによってもいつでも変更できるためです。
また、DateTimeFormatter
で使用する必要がある文字を知るにはどうすればよいですか? javadoc を読んだところです。
ここには2つの日付フォーマッターが必要です。 1つは入力を解析し、別のフォーマッターは出力をフォーマットします。
SimpleDateFormat inDateFmt = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat outDateFmt = new SimpleDateFormat("EEE dd MMM yyyy");
try {
Date date = inDateFmt.parse(match.getDate());
textViewDate.setText(outDateFmt.format(date));
} catch (ParseException ex) {
System.out.println(ex.toString());
}
LocalDate
.parse(
"01/04/2018" ,
DateTimeFormatter // Parses & generates text in various formats
.ofPattern( "dd/MM/uuuu" ) // Define a formatting pattern to match your input.
) // Returns a `LocalDate` object.
.toString() // Generates text in standard ISO 8601 format.
2018-04-01
次の日付形式の文字列がデータベース(match.getDate)にあります。
日時の値をテキストとして保存しないでください。
日時データ型を使用して、日時値をデータベースに格納する必要があります。標準SQLでは、時刻とタイムゾーンのない日付のみの値は、DATE
型の列に格納されます。
もう1つの問題は、Javaクラスで日付のみの値を表現しようとしていることです。これは、時間帯、またはタイムゾーンのコンテキストでの時刻付きの日付、またはUTCからのオフセットを含む日付を表します。四角い止め釘、丸い穴。日付のみのデータ型を使用すると、問題がなくなります。
他のAnswersは時代遅れのクラスを使用していましたが、数年前にJava 8以降に組み込まれ、Android 26以降に組み込まれたJava.timeクラスに取って代わられました。以前のJavaおよびAndroidについては、以下のリンクを参照してください。
Javaでは、時刻とタイムゾーンのない日付のみの値は、LocalDate
クラスで表されます。
LocalDate ld = LocalDate.parse( "2020-01-23" ) ; // Parsing a string in standard ISO 8601 format.
カスタムのフォーマットパターンについては、DateTimeFormatter
を使用します。
String input = "01/04/2018" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
標準のISO 8601形式で文字列を生成します。
String output = ld.toString() ;
カスタム形式で文字列を生成します。
String output = ld.format( f ) ;
ヒント:出力を自動的にローカライズするには、DateTimeFormatter.ofLocalizedDate
を使用します。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い レガシー 日時クラス Java.util.Date
、 Calendar
、&-に取って代わります。 SimpleDateFormat
。
詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。
Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用します。文字列も、Java.sql.*
クラスも必要ありません。
Java.timeクラスはどこで入手できますか?
new SimpleDateFormat("EEE dd MMM yyyy", Locale.ENGLISH);
で試してください
サンプルコード:
DateFormat originalFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("EEE dd MMM yyyy", Locale.ENGLISH);
Date date = originalFormat.parse("01/04/2018");
String formattedDate = targetFormat.format(date); // Sun 01 Apr 2018
これを試してください、あなたはこれであなたが望む任意の日付フォーマットを作成することができます
public String parseTime(String date){
SimpleDateFormat format = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss");
try {
Date date1 = format.parse(date.replace("T"," "));
String d= new SimpleDateFormat("yyyy/dd/MM HH:mm:ss").format(date1);
return d;
}catch (Exception e){
e.printStackTrace();
}
return "";
}
最初にmatch.getDate()メソッドを確認します。指定された日付のフォーマットが上記で指定されている場合、フォーマットの日付を定義し、次にコードで使用され、上記のフォーマットで日付を表示します...
String date="09/03/2018";
SimpleDateFormat parseDateFormat = new SimpleDateFormat("dd/MM/yyyy"); // if your match.getDate() given this format date.and if is given different format that time define that format.
DateFormat formatdate = new SimpleDateFormat("EEE dd MMM yyyy");
try {
Date date1=parseDateFormat.parse(date);
Log.d("New Date",formatdate.format(date1));
} catch (ParseException e) {
e.printStackTrace();
}
出力::金2018年3月9日