您的時區 - 程序運行時的默認區別與給DatatypeConverter.parseDateTime()方法指定的時區不同,並且cal.getTime()。toString()方法使用默認時區格式化日期。
千萬不要使用Date.toString()來格式化日期 - 日期只知道從紀元時間開始的毫秒數。相反使用java.text.SimpleDateFormat
這樣的:
SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").format(dateObject).
import java.util.Calendar;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
import javax.xml.bind.DatatypeConverter;
class TestDate
{
public static void main(String[] args)
{
Calendar cal = DatatypeConverter.parseDateTime("2012-05-29T11:17:04.805-07:00");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
df.setTimeZone(TimeZone.getTimeZone("GMT-07:00"));
String date = df.format(cal.getTime());
System.out.println(date);
}
}
然後小心。 SimpleDateFormat不是線程安全的。如果你創建一個實例,使用它,然後扔掉它,你很好。否則,您可能需要將其放在ThreadLocal中,或將其全部用於同步塊中。 –