android/java se SimpleDateFormat时区问题



我在安卓2.1上运行的程序中遇到了一个奇怪的问题,对我来说这似乎是安卓中的一个错误。请告诉我这里发生了什么,因为我迷路了。:)

以下程序:

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上使用最新的javase时返回此消息:

(~) % 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): ------------------------------------------------------------------

有人知道这个特定的android api版本中存在时区和日期解析的问题吗?这对我来说是一个非常奇怪的问题,因为android版本应该返回与javase版本完全相同的结果,但事实并非如此。

感谢您的任何提示,

Karsten

尝试用setTimeZone("GMT")替换setTimeZone("UTC"),它可能与现在的英国夏令时(BST)的0子午线(GMT+1)不同。

是的,我试过了,得到了和你一样的结果。我想那是个bug。

http://code.google.com/p/android/issues/detail?id=8258可能会帮助您完成

我已经在windows java和android2.3中进行了测试。我在这两种情况下都得到了相同的结果。我认为这个bug在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语句

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

谢谢Deepak

我设法使用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问题)。

相关内容

  • 没有找到相关文章

最新更新