我在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版本完全相同但不支持。
感谢任何提示,
卡斯滕
答案 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的导入语句
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;
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问题。)