android / java se SimpleDateFormat TimeZone问题

时间:2011-05-27 15:05:23

标签: android date timezone

我在android 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上使用最新的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

但是当我在我的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和Date解析的问题?这对我来说是一个非常奇怪的问题,因为android版本应该返回与java se版本完全相同但不支持。

感谢任何提示,

卡斯滕

5 个答案:

答案 0 :(得分:0)

尝试将setTimeZone("UTC")替换为setTimeZone("GMT")它可能是不同的实现,现在是BST(英国夏令时)tz中的0-meridian,即GMT + 1.

答案 1 :(得分:0)

是的,我尝试过并得到了和你一样的结果。我想那是一个错误。

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

答案 2 :(得分:0)

我在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;

由于 迪帕克

答案 3 :(得分:0)

我设法使用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) {

    }

答案 4 :(得分:0)

尝试在每次调用setTimeZone()/ format()之前重新创建SimpleDateFormat对象。

这解决了我在使用常见的SimpleDateFormat对象格式化跨越DST更改的一组时间时遇到的问题。如果集合中的第一次是在DST阈值之后,则集合中的所有时间都被正确格式化。如果集合中的第一次是在DST阈值之前,那么在DST阈值之后的所有时间都被错误地格式化(即一小时) - 并且即使我在每次format()调用之前尝试调用setTimeZone()时,这仍然继续。 / p>

我从中得出的结论是,SimpleDateFormat对象使用的时区与第一个format()调用相关联,后续对setTimeZone()的调用被有效地忽略或覆盖(这听起来像Java问题,而不是Android问题。)