![](/img/trans.png)
[英]Setting and formatting time zone with Calendar object in Java and then returning a Date object
[英]Formatting a Calendar object and not a Date object?
我正在嘗試格式化日歷字符串以指示本地時區以外的時區偏移量。 我知道我可以創建一個簡單的格式化字符串並使用Calendar.get(int)
方法來填充所有值,但這並不是正確的方法。
Java 有一個DateFormat
,特別是我正在嘗試使用SimpleDateFormat
。 問題是這些類的format()
方法需要一個Date
對象。
我主要使用Calendar
對象,因為我相信這些是 Java 中推薦的結構。 所以,當我去格式化我的結果時間時,我調用Calendar.getTime()
它返回一個Date
對象,該對象可以傳遞給SimpleDateFormat
對象。
到目前為止,我認為這非常簡單,但這就是問題所在。
每當調用Calendar.getTime()
方法時,返回的Date
總是在本地時區,而不管Calendar
的時區。
所以,當我將時間傳遞給我的SimpleDateFormat
時,我總是在本地時區打印時間,這不是我想要的。 到目前為止,我所做的所有研究都說它無法完成,並且我看到的所有示例都只是使用Calendar.get(int)
方法來填充一些空白。 這看起來很糟糕,如果 DateFormat 類如此無用,為什么還要有它呢?
這是一些示例代碼,因此您可以了解我的意思,將其粘貼到您最喜歡的測試類中:
private static final SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public static void main(String[] args)
{
try
{
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
cal.setTimeInMillis(parser.parse("2012-10-09T22:01:49.108-0700").getTime());
System.out.println(formatter.format(cal.getTime()));
}
catch(ParseException e)
{
e.printStackTrace();
}
}
產生的輸出(因為我在中央時區運行):2012-10-10T00:01:49-0500
預期輸出(不管它是從哪個時區運行的):2012-10-10T01:01:49-0400
總結一下問題:有沒有辦法讓 Java 中的 DateFormat 接受日歷,或者有辦法獲取不在本地時區中的日期,或者我應該為這種格式完全使用另一個類嗎?
每當調用 Calendar.getTime() 方法時,返回的日期總是在本地時區,與日歷的時區無關。
不,這不對。 Date
沒有一個時區。 這只是自 Unix 時代以來的毫秒數。 它的toString()
方法確實將其轉換為本地時區,但這不是Date
對象中信息的一部分。
您需要做的就是將格式化程序的時區設置為與日歷的時區相同。
formatter.setTimeZone(calendar.getTimeZone());
...或者只是將日歷設置為完全使用:
formatter.setCalendar(calendar);
(我不是很清楚后一種方法是否意味着日歷會失去它的價值……基本上,Java 類將“日歷系統”、“時區”和“日歷內的值”混合在一個單一類型中,這非常不幸。)
我同意伊恩不過,在為一個更愉快的API使用約達時間的條款。
我會為此放棄內置的 Java 日期和時間類,而改用joda 時間。 它旨在正確處理 ISO8601 格式字符串並正確處理時區。
Date 沒有任何 TimeZone,它只是自紀元時間以來的毫秒數,以人類可讀的格式表示。 我們可以使用“DateFormat”類。
TimeZone tz = TimeZone.getTimeZone("America/Buenos_Aires");
Calendar cal = Calendar.getInstance(tz);
Date d = cal.getTime();
DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm aaa");
df.setTimeZone(tz);
String s = df.format(cal.getTime());
System.out.println(s);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.