Android / Java SE SimpleDateFormat TimeZone проблема - PullRequest
2 голосов
/ 27 мая 2011

Я сталкиваюсь со странной проблемой в программе, работающей на Android 2.1, которая мне кажется ошибкой в ​​Android.Пожалуйста, просветите меня о том, что здесь происходит, так как я потерян.:)

Следующая программа:

import java.util.*;
import java.text.*;

class TestMe {
    public static void main(String[] args) {
            String time = "2010-08-01T18:00:00+0000";

            TimeZone tg = TimeZone.getDefault();
            System.out.println(tg.getID());

            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

            try {
                Date indate = formatter.parse(time);

                String outdate = formatter.format(indate);
                System.out.println(outdate);

                formatter.setTimeZone( TimeZone.getTimeZone("UTC"));

                String ooutdate = formatter.format(indate);
                    System.out.println(ooutdate);

                formatter.setTimeZone( TimeZone.getDefault() );
                Date ioutdate = formatter.parse(ooutdate);
                System.out.println(formatter.format(ioutdate));

                } catch( Exception e ) {
                    e.printStackTrace();
            }
        }
        }

возвращает это при использовании последней версии Java на Mac:

(~) % javac -g TestMe.java && java TestMe                                                                                                                                                                                                              
Europe/Berlin
2010-08-01T20:00:00+0200
2010-08-01T18:00:00+0000
2010-08-01T20:00:00+0200

, но возвращает следующее при запускевнутри метода в моем приложении для Android на 2.1:

I/System.out( 5379): ------------------------------------------------------------------
I/System.out( 5379): Europe/Berlin
I/System.out( 5379): 2010-08-01T20:00:00+0200
I/System.out( 5379): 2010-08-01T18:00:00+0100
I/System.out( 5379): 2010-08-01T18:00:00+0100
I/System.out( 5379): ------------------------------------------------------------------

Кто-нибудь знает о проблемах в этой конкретной версии Android API, с TimeZone и разбор даты?Это очень странная проблема для меня, так как версия для Android должна возвращать точно такую ​​же версию, как и версия Java, но не возвращает.

Спасибо за любые подсказки,

Карстен

Ответы [ 5 ]

0 голосов
/ 25 сентября 2011

Попробуйте воссоздать объект SimpleDateFormat перед каждым вызовом setTimeZone () / format ().

Это исправило проблему, возникающую при использовании общего объекта SimpleDateFormat для форматирования набора времени, охватывающего изменение летнего времени. Если первый раз в наборе был после порога DST, все времена в наборе были отформатированы правильно. Если первый раз в наборе был до порога DST, то все разы после порога DST были неправильно отформатированы (т. Е. Были через час) - и это продолжалось, даже когда я пытался вызывать setTimeZone () перед каждым вызовом format ().

Из этого я сделал вывод, что часовой пояс, используемый объектом SimpleDateFormat, привязан к первому вызову format (), а последующие вызовы setTimeZone () эффективно игнорируются или перезаписываются (что звучит для меня как проблема Java, а не проблема Android).

0 голосов
/ 30 мая 2011

Мне удалось выполнить запланированное преобразование даты с помощью объекта Calendar:

        try{ 
        String time = "2010-08-01T18:00:00+0000";

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        Date indate = formatter.parse(time);

        Calendar cal = Calendar.getInstance();
        System.out.println("time right now: " + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH) + "T" + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "Z");

        cal.setTime( indate );

        System.out.println("time from date string: " + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH) + "T" + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "Z");

        Calendar utcCal = new GregorianCalendar( TimeZone.getTimeZone("UTC"));
        utcCal.setTimeInMillis( cal.getTimeInMillis() );

        System.out.println("time from date string in utc: " + utcCal.get(Calendar.YEAR) + "-" + (utcCal.get(Calendar.MONTH) + 1) + "-" + utcCal.get(Calendar.DAY_OF_MONTH) + "T" + utcCal.get(Calendar.HOUR_OF_DAY) + ":" + utcCal.get(Calendar.MINUTE) + ":" + utcCal.get(Calendar.SECOND) + "Z");

    } catch( Exception e) {

    }
0 голосов
/ 27 мая 2011

Да, я попробовал и получил тот же результат, что и вы.Я думаю, это ошибка.

http://code.google.com/p/android/issues/detail?id=8258 может помочь вам

0 голосов
/ 27 мая 2011

Я тестировал в Windows Java и Android2.3. Я получаю одинаковый результат в обоих случаях. Я думаю, что ошибка больше не в Android 2.3. Тем не мение пожалуйста, проверьте операторы импорта для Android по сравнению с Java

операторы импорта в Android

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

операторы импорта в Java

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

Спасибо Дипак

0 голосов
/ 27 мая 2011

Попробуйте заменить setTimeZone("UTC") на setTimeZone("GMT"), это может быть другая реализация, так как теперь 0-меридиан в BST (британское летнее время) tz, который является GMT + 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...