web-dev-qa-db-ja.com

Java:解析不能な日付の例外

日付形式を変換しようとすると、例外:解析不能な日付が表示され、この問題を修正する方法がわかりません。

イベントの日付を表す文字列を受け取りました。GUIでこの日付を異なる形式で表示したいと思います。

私がやろうとしていたことは次のとおりです:

private String modifyDateLayout(String inputDate){
        try {
            //inputDate = "2010-01-04 01:32:27 UTC";
            Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(inputDate);
            return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
        } catch (ParseException e) {
            e.printStackTrace();
            return "15.01.2010";
        }
    }

とにかくライン

String modifiedDateString = originalDate.toString();

ダミーです。次の形式の日付文字列を取得したい:

dd.MM.yyyy HH:mm:ss

入力文字列の例は次のとおりです。

2010-01-04 01:32:27 UTC

上記の例の日付(文字列)を文字列形式dd.MM.yyyy HH:mm:ssに変換する方法を知っている人はいますか?

ありがとうございました!

編集:間違った入力日付形式を修正しましたが、それでも動作しません。上記は貼り付けられたメソッドであり、以下はデバッグセッションの画面イメージです。

alt text http://img683.imageshack.us/img683/193/dateproblem.png

#Update走った

String[] timezones = TimeZone.getAvailableIDs();

そして、配列にUTC文字列があります。奇妙な問題です。

私は働く汚いハックをしました:

private String modifyDateLayout(String inputDate){
    try {
        inputDate = inputDate.replace(" UTC", "");
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);
        return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
    } catch (ParseException e) {
        e.printStackTrace();
        return "15.01.2010";
    }
}

それでも、タイムゾーンを削減せずに元の入力を変換したいです。

このコードは、JDK 1.6を使用するAndroid電話用に記述されています。

24
Niko Gamulin

ここで基本的にやっているのは、すでに固定パターンを持っている Date#toString() に依存していることです。 Java Dateオブジェクトを別の人間が読める文字列パターンに変換するには、 SimpleDateFormat#format() が必要です。

_private String modifyDateLayout(String inputDate) throws ParseException{
    Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(inputDate);
    return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
}
_

ちなみに、「解析不能な日付」例外は、ここでonlySimpleDateFormat#parse() によってスローされます。これは、inputDateが期待されるパターン_"yyyy-MM-dd HH:mm:ss z"_にないことを意味します。おそらく、inputDateの実際のパターンに一致するようにパターンを変更する必要があります。

更新:さて、テストを行いました:

_public static void main(String[] args) throws Exception {
    String inputDate = "2010-01-04 01:32:27 UTC";
    String newDate = new Test().modifyDateLayout(inputDate);
    System.out.println(newDate);
}
_

これは正しく印刷されます:

_03.01.2010 21:32:27
_

(私はGMT-4にいます)

更新2:あなたの編集により、あなたは本当にParseExceptionを得ました。最も疑わしい部分は、UTCのタイムゾーンです。これは実際にはknown at Java environment?what Java version and what OS version are use?Check TimeZone.getAvailableIDs() 。間にUTCが必要です。

48
BalusC

Talendでこのエラーが発生しました。 Redshiftから作成されたS3 CSVファイルを問題なく保存できました。同じS3 CSVファイルをAmazon RDS MySQLデータベースにロードしようとしたときにエラーが発生しました。デフォルトのタイムスタンプTalendタイムスタンプ形式を試しましたが、MySQLへのロード時にexception:unparseable dateをスローしていました。

受け入れられた答えからこれは私がこの問題を解決するのを助けました:

ちなみに、「解析不能な日付」例外は、ここではSimpleDateFormat#parse()によってのみスローされます。これは、inputDateが予期されたパターン「yyyy-MM-dd HH:mm:ss z」にないことを意味します。 inputDateの実際のパターンに一致するように、おそらくパターンを変更する必要があります。

私のソリューションの鍵は、Talendスキーマを変更することでした。 Talendはタイムスタンプフィールドを「date」に設定したので、「timestamp」に変更してから、「yyyy-MM-dd HH:mm:ss z」をフォーマット文字列の列に挿入しましたスクリーンショットをここに表示します talend schema =

タイムスタンプ文字列の最後に「z」を追加するまで、12時間および24時間のタイムスタンプ変換に関する他の問題がありました。

0
Pixel Power LLC