web-dev-qa-db-fra.com

Java: exception de date impossible à analyser

En essayant de transformer le format de la date, j'obtiens une exception: une date impossible à analyser et je ne sais pas comment résoudre ce problème.

Je reçois une chaîne qui représente une date d'événement et je souhaite afficher cette date dans un format différent dans l'interface graphique.

Ce que j'essayais de faire, c'est ce qui suit:

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

Quoi qu'il en soit, la ligne

String modifiedDateString = originalDate.toString();

est factice. Je souhaite obtenir une chaîne de date au format suivant:

jj.MM.aaaa HH: mm: ss

et l'exemple de chaîne d'entrée est le suivant:

2010-01-04 01:32:27 UTC

Quelqu'un sait-il comment convertir l'exemple de date (chaîne) ci-dessus au format chaîne jj.MM.aaaa HH: mm: ss?

Merci!

Edit: J'ai corrigé le mauvais format de date d'entrée mais cela ne fonctionne toujours pas. Ci-dessus est la méthode collée et ci-dessous est l'image d'écran de la session de débogage.

texte alternatif http://img683.imageshack.us/img683/193/dateproblem.png

# Mise à jour J'ai couru

String[] timezones = TimeZone.getAvailableIDs();

et il y a une chaîne UTC dans le tableau. C'est un étrange problème.

J'ai fait un hack sale qui fonctionne:

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

Mais je préférerais quand même transformer l'entrée d'origine sans couper le fuseau horaire.

Ce code est écrit pour Android utilisant JDK 1.6.

24
Niko Gamulin

Ce que vous faites ici, c'est de compter sur Date#toString() qui a déjà un modèle fixe. Pour convertir un Java Date objet en un autre modèle String lisible par l'homme, vous avez besoin de 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);
}

Soit dit en passant, l'exception "date impossible à analyser" peut ici uniquement être levée par SimpleDateFormat#parse() . Cela signifie que le inputDate n'est pas dans le modèle attendu "yyyy-MM-dd HH:mm:ss z". Vous devrez probablement modifier le modèle pour qu'il corresponde au modèle réel de inputDate.

Mise à jour: D'accord, j'ai fait un test:

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);
}

Cela imprime correctement:

03.01.2010 21:32:27

(Je suis sur GMT-4)

Mise à jour 2: selon votre modification, vous avez vraiment obtenu un ParseException à ce sujet. La partie la plus suspecte serait alors le fuseau horaire de UTC. Est-ce réellement connu dans votre Java? Quelle est Java et quelle version de système d'exploitation utilisez-vous? Vérifier - TimeZone.getAvailableIDs() . Il doit y avoir un UTC entre les deux.

48
BalusC

J'ai rencontré cette erreur en travaillant dans Talend. J'ai pu stocker des fichiers S3 CSV créés à partir de Redshift sans problème. L'erreur s'est produite lorsque j'essayais de charger les mêmes fichiers S3 CSV dans une base de données Amazon RDS MySQL. J'ai essayé les formats d'horodatage Talend par défaut mais ils lançaient une exception: une date impossible à analyser lors du chargement dans MySQL.

Cela à partir de la réponse acceptée m'a aidé à résoudre ce problème:

Soit dit en passant, l'exception "date non comparable" ne peut être levée ici que par SimpleDateFormat # parse (). Cela signifie que la date d'entrée n'est pas dans le modèle attendu "aaaa-MM-jj HH: mm: ss z". Vous devrez probablement modifier le modèle pour qu'il corresponde au modèle réel de inputDate

La clé de ma solution était de changer le schéma Talend. Talend a défini le champ d'horodatage sur "date", je l'ai donc changé en "horodatage", puis j'ai inséré "aaaa-MM-jj HH: mm: ss z" dans la colonne de la chaîne de format.Voir une capture d'écran ici schéma talend =

J'ai eu d'autres problèmes avec les traductions d'horodatage 12 heures et 24 heures jusqu'à ce que j'ajoute le "z" à la fin de la chaîne d'horodatage.

0
Pixel Power LLC