簡體   English   中英

格式化日歷對象而不是日期對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM