问题描述
|
我在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问题)。