проблема с часовым поясом Android / java se SimpleDateFormat

#android #date #timezone

#Android #Дата #Часовой пояс

Вопрос:

Я сталкиваюсь со странной проблемой в программе, работающей на 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 se на Mac:

 (~) % javac -g TestMe.java amp;amp; 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 с разбором часового пояса и даты? Для меня это очень странная проблема, поскольку версия Android должна возвращать точно то же самое, что и версия java se, но этого не происходит.

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

Karsten

Ответ №1:

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

Комментарии:

1. спасибо за предложение! Я пытался, но, к сожалению, с тем же результатом, что и раньше :/

Ответ №2:

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

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

Ответ №3:

Я тестировал в Windows Java и android2.3. Я получаю одинаковый результат в обоих случаях. Я думаю, что ошибки больше нет в Android 2.3. В любом случае, пожалуйста, проверьте инструкции import для 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;
  

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

Комментарии:

1. да, я использую эти инструкции импорта. спасибо за ответ!

Ответ №4:

Мне удалось выполнить предполагаемое преобразование даты с использованием объекта 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) {

    }
  

Ответ №5:

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

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

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