web-dev-qa-db-ja.com

Simpledateformat解析不能な日付

データベースに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日」

5
Carl Bruiners

私が作成したこの日付フォーマッタメソッドを使用する

    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") 

そして、あなたは望ましい出力を得るでしょう

3
Harsh Patel

他の答えはあなたの問題を解決しました、しかし私はいくつかの概念とあなたの最初の試みがうまくいかなかった理由を知ることは重要だと思います。

datedateを表すテキストには違いがあります。

例:今日の日付は2018年3月9日です。その日付は単なる概念であり、「カレンダーシステムの特定のポイント」のアイデアです。

ただし、同じ日付を多くの形式でrepresentedにすることができます。これは、「グラフィック」の場合もあれば、紙の数字の周りに特定の順序で他の多くの数字が並んだ円の形の場合もあれば、次のようなプレーンテキストの場合もあります。

  • 2018年9月3日(日/月/年)
  • 2018年3月9日(モンティ/日/年)
  • 2018-03-09( ISO8601形式
  • 3月9日番目 2018年
  • 2018年3月9日(ポルトガル語)
  • 2018年3月5日
  • 等々...

テキスト表現は異なりますが、すべて同じ日付(同じ値)を表すことに注意してください。

それを念頭に置いて、Javaがこれらの概念でどのように機能するかを見てみましょう。

Androidでは、使用しているAPIレベルで_Java.time_クラスが使用可能な場合はそれを使用できます。それより低いAPIレベルの場合は threeten backportこちらの方法を確認)使用してください )。日付を処理するためのより簡単で信頼性の高いツールがあります。

あなたの場合、String(日付を表すテキスト)があり、それを別の形式に変換したいとします。次の2つの手順で行う必要があります。

  1. Stringを特定の日付タイプに変換します(テキストを日/月/年の数値に変換します)。これは解析と呼ばれます
  2. この日付タイプの値を何らかの形式に変換します(数値を特定の形式のテキストに変換します)-これはformattingと呼ばれます

あなたの試みがうまくいかなかった理由:

  • Date::toString() method を呼び出したため、最初の試行で誤った形式が返されました。これは、その形式(_Sun Apr 08 00:00:00 GMT+00:00 2018_)で出力(テキスト表現)を生成するため、解析正しかったが、フォーマットは正しくなかった
  • 2回目の試行では、出力パターン(_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 を読んだところです。

1
shind

ここには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());
}
1
kshetline

tl; dr

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からのオフセットを含む日付を表します。四角い止め釘、丸い穴。日付のみのデータ型を使用すると、問題がなくなります。

Java.time

他の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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い レガシー 日時クラス Java.util.DateCalendar 、&-に取って代わります。 SimpleDateFormat

詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。

Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用します。文字列も、Java.sql.*クラスも必要ありません。

Java.timeクラスはどこで入手できますか?

1
Basil Bourque

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
1
Gokul Nath KP

これを試してください、あなたはこれであなたが望む任意の日付フォーマットを作成することができます

        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 "";
    }
0
akshay

最初に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日

0
Android Team