2010-01-05 5 views
18

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

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

Ce que je tentais de faire est la suivante:

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 voudrais obtenir une chaîne de date dans le format suivant:

dd.MM.yyyy HH: mm: ss

et l'exemple de chaîne d'entrée est la suivante:

2010-01-04 01:32:27 UTC

Est-ce que quelqu'un sait comment convertir la date d'exemple (String) ci-dessus dans un format de chaîne dd.MM.yyyy HH: mm: ss?

Merci! Editer: 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 de l'écran de la session de débogage.

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

#update Je couru

String[] timezones = TimeZone.getAvailableIDs(); 

et il est UTC chaîne du tableau. C'est un problème étrange.

J'ai fait un sale hack 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 transformer l'entrée d'origine sans coupant le fuseau horaire.

Ce code est écrit pour le téléphone Android en utilisant JDK 1.6.

+0

Je sais qu'il s'agit d'un thread depuis longtemps mais pour clarifier les doutes concernant l'exception d'analyse lorsque "UTC" est dans le format de la date. Le code est cassé dans Android. [Rapport de bogue Android] (http://code.google.com/p/android/issues/detail?id=14963) – Creniale

Répondre

39

Qu'est-ce que vous faites ici essentiellement se fonde sur Date#toString() qui a déjà un motif fixe. Pour convertir un objet Java Date en un autre modèle de chaîne lisible par un humain, 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); 
} 

Par ailleurs, la "date Unparseable" exception peut ici que être jeté par SimpleDateFormat#parse(). Cela signifie que le inputDate n'est pas dans le modèle prévu "yyyy-MM-dd HH:mm:ss z". Vous devrez probablement modifier le motif pour qu'il corresponde au motif réel du inputDate.

Mise à jour: D'accord, je l'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); 
} 

Cette impression est correcte:

03.01.2010 21:32:27 

(je suis GMT-4)

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

+0

Le problème est que la ligne Date date = formatter.parse (inputDate); déclenche une exception. J'ai fixé le format d'entrée à aaaa-MM-jj HH: mm: ss z mais il jette toujours une exception. –

+0

Je m'y attendais, voir ma modification qui a été ajoutée avant que vous ne commentiez. Si vous voulez plus d'aide pour trouver le bon motif, vous devez afficher un exemple de la valeur ** effective ** 'inputDate'. – BalusC

+1

J'ai du mal à analyser cette date: "11/10/2011 06:03:19 p.m." – DkAngelito

Questions connexes