Странный результат анализа даты и времени с SimpleDateFormat - PullRequest
5 голосов
/ 06 ноября 2010

У меня странная проблема при разборе даты и времени ISO8601 с SimpleDateFormat. Соответствующий код:

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

Для ввода я даю строку

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

И в качестве возврата я получаю объект Date с датой 6 января 2010 года с временем 13:30 и часовым поясом GMT + 00: 00.

РЕДАКТИРОВАТЬ: я также пытался использовать "2010-09-06T15: 30: 00 + 0200" с теми же результатами.

Смущает то, что дата установлена ​​частично правильно, просто месяц установлен неправильно.

Проблема отображается на Android 1.6 и Android 2.2.

Как я могу это исправить?

Ответы [ 5 ]

6 голосов
/ 07 ноября 2010

Ваша проблема воспроизводима, если вы используете mm в течение месяца вместо MM.

Так что я подозреваю, что причина проблемы есть и что вы не используете версию кодаты думаешь ты бежишь.Перекомпилируйте и повторите код, как вы в своем вопросе.Это правильно.

2 голосов
/ 06 ноября 2010

Вы обрабатываете ParseException?Код должен выдавать ParseException для этой входной строки.
Не уверен насчет Android, но в Java 6 входная строка 2010-09-06T15:30:00+02:00 недопустима.

+02:00 не является допустимым часовым поясом.
Попробуйте без двоеточия:

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

A трюк (тест) - использование DateFormat дляотформатируйте дату и проверьте созданную строку:

    System.out.println(iso8601formatter.format(new Date()));  
2 голосов
/ 06 ноября 2010

Возможно, это не ваша проблема, но, поскольку SimpleDateFormat не является поточно-ориентированным , вам нужно изменить код на:

public class DateHelper
{
    public static Date parseISO8601(String date) throws ParseException
    {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(date);
    }
}
1 голос
/ 07 ноября 2010

Я создал проект 1.6, и код работал для меня ...

<pre>public class DateHelper { private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");</p> <pre><code>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); }

}

<pre>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);</p> <pre><code> 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()); }

}

Для меня это распечатывает:

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

Что для меня все правильно ...

0 голосов
/ 07 ноября 2010

для разбора первой строки, которую вы должны использовать

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;

при разборе часового пояса, например, +02: 00, он с z вместо Z. надеюсь, это поможет. и проблема с предоставлением вам +00: 00, я думаю, связана с языком, который вы используете. Вы должны попробовать проверить его с другой локалью.

...