Question

J'ai un étrange problème lors de l'analyse d'une date et l'heure avec ISO8601 SimpleDateFormat. Le code correspondant est:

public class DateHelper
{
    private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    public static Date parseISO8601(String date) throws ParseException
    {
        Date result = iso8601formatter.parse(date);
        return result;
    }
}

Pour l'entrée je donne une chaîne

2010-09-06T15:30:00+02:00

Et comme un retour je reçois un objet Date avec date fixée au 6 Janvier 2010, avec le temps de 13:30 et le fuseau horaire de GMT + 00:. 00

EDIT: J'ai aussi essayé d'utiliser "2010-09-06T15: 30: 00 + 0200". Avec les mêmes résultats

Confondre chose est que la date fixée est partiellement correcte, juste le mois est mal réglé.

La question est affichée sur Android 1.6 et Android 2.2.

Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

Votre problème est si vous utilisez reproductible mm pour le mois au lieu de MM.

Je soupçonne que la cause du problème est là et que vous n'êtes pas en cours d'exécution de la version du code que vous pensez que vous utilisez. Recompilation et réexécuter le code que vous avez dans votre question. Il est exact.

Autres conseils

Probablement pas votre problème, mais depuis SimpleDateFormat est pas fil de sécurité, vous devez changer votre code:

public class DateHelper
{
    public static Date parseISO8601(String date) throws ParseException
    {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(date);
    }
}

Êtes-vous la manipulation de la ParseException? Le code devrait être lancer une ParseException pour cette chaîne d'entrée.
Pas sûr Android, mais avec Java 6 la chaîne entrée 2010-09-06T15:30:00+02:00 est pas valide.

+02:00 n'est pas un fuseau horaire valide.
Essayez sans les deux points:

    2010-09-06T15:30:00+0200  

trick (test) est d'utiliser le DateFormat pour formater une date et vérifiez la chaîne créée:

    System.out.println(iso8601formatter.format(new Date()));  

Je créé un projet 1.6 et le code a fonctionné pour moi ...

public class DateHelper {
    private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public static Date parseISO8601(String date) throws ParseException {
    Date result = iso8601formatter.parse(date);
    return result;
}

public static String makeISO8601String(Date date) {
    return iso8601formatter.format(date);
}

}

public class StackOverflowTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    TextView textView = (TextView)this.findViewById(R.id.textView);

    StringBuilder builder = new StringBuilder();
    try {
        String badDateString = "2010-09-06T15:30:00+0200";
        Date parsedDate = DateHelper.parseISO8601(badDateString);
        builder.append(badDateString).append("\n");
        builder.append(parsedDate.toString()).append("\n");
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String dateString = DateHelper.makeISO8601String(new Date());
    builder.append("now="+dateString).append("\n");

    textView.setText(builder.toString());
}

}

Pour moi, il imprime:

2010-09-06T15:30:00+0200
Mon Sep 06 06:30:00 PDT 2010
now=2010-11-06T14:41:55-077

Ce qui est tout bon pour moi ...

pour l'analyse de la première chaîne u devrait utiliser

public static Date parseDateFromString(String aDateString){
    SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
    Date date=null;
    try {
        date= inputFormat.parse(aDateString);
    } catch (ParseException e) {
        return null;
    }
    return date;

lors de l'analyse du Timezone comme +02: 00 il est avec z au lieu de Z. espère que cela aide. et la question avec vous donnant +00: 00 je pense est connecté avec les paramètres régionaux que vous utilisez. u devrait essayer de le tester avec un lieu différent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top