我在安卓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问题)。