android / javase SimpleDateFormat TimeZone问题

问题描述

| 我在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();
            }
        }
        }
在Mac上使用最新的java se时,返回:
(~) % 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
但是当我在2.1上的android应用程序的方法中运行它时返回以下内容
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): ------------------------------------------------------------------
有人知道使用TimeZone和Date解析此特定android api版本中的问题吗?这对我来说是一个非常奇怪的问题,因为它的android版本应该返回与java se版本完全相同的返回值,但是不会。 谢谢你的提示 卡斯滕     

解决方法

        尝试将
setTimeZone(\"UTC\")
替换为
setTimeZone(\"GMT\")
,可能会有所不同,因为现在BST(英国夏令时)tz中的0子午线为GMT + 1。     ,        是的,我尝试过,并得到与您相同的结果。我猜那是一个错误。 http://code.google.com/p/android/issues/detail?id=8258可能会帮助您     ,        我已经在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;
谢谢 迪帕克     ,        我设法使用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) {

    }
    ,        尝试在每次调用setTimeZone()/ format()之前重新创建SimpleDateFormat对象。 这修复了我在使用通用SimpleDateFormat对象格式化一组跨越DST更改的时间时遇到的问题。如果该组中的第一次是DST阈值之后,则该组中的所有时间均已正确格式化。如果集合中的第一次是DST阈值之前的时间,那么DST阈值之后的所有时间都被错误地格式化(即一个小时),即使我在每次format()调用之前尝试调用setTimeZone(),这种情况仍会继续。 我从中推断出的是,SimpleDateFormat对象使用的时区与第一个format()调用绑定,并且对setTimeZone()的后续调用被有效地忽略或覆盖(在我看来,这像是Java问题,而不是Android问题)。