2012-07-28 103 views
0

我有一個日期,例如2000-01-01T10:00:00Z。這意味着店鋪的營業時間,所以這意味着店鋪在10點營業。其他信息是無用的,這是一個隨機的日期。 我只需要將它表示爲一個字符串,如下所示:10:00。 對於這種轉換,我用一個簡單的方法:日期到時間字符串轉換錯誤一小時

public String dateToString(Date date){ 
    SimpleDateFormat ft = new SimpleDateFormat ("HH:mm"); 
    String time= ft.format(date); 
return time; 
} 

我想這應該工作,資本HH爲小時24小時表示。但是當我運行這個代碼時,返回值是11:00! 這是爲什麼,以及如何預防它?格式化功能是否需要查看我的時區,並在日期中設置錯誤(我認爲我的手機設置爲mgt + 1,因爲我住在荷蘭)?而如何忽略這一點?

+1

'Z'表示GMT + 0,所以是錯誤的時區。 – Voo 2012-07-28 20:45:08

+0

我在伊朗有過類似的問題。當我禁用我的操作系統夏令時(通過使用不支持夏令時的時區),一切都變得正確! – 2012-07-28 20:56:56

+0

@AmirPashazadeh更改主機操作系統上的默認時區並不是解決此問題的最佳方式。取而代之的是(a)使用java.time類,並且(b)總是在日期 - 時間類的各種方法中指定可選的時區參數。 – 2016-09-26 21:33:38

回答

1

oke,找到它! Android會將日期轉換爲設備的時區。我不得不否決是:

這工作:

public String dateToString(Date date){ 
    SimpleDateFormat ft = new SimpleDateFormat ("HH:mm"); 
    ft.setTimeZone(TimeZone.getTimeZone("UTC")); 
    String time= ft.format(date); 
return time; 
} 
0

2000-01-01T10:00:00Z不是完全沒有「無用」。這描述了時間線上的確切時刻,具有日期,時間和offset-from-UTC,在這種情況下是UTC本身。

ISO 8601

即串格式是由標準ISO 8601定義。 Z最後是Zulu的縮寫,意思是UTC。

Instant

您可以直接解析這個字符串作爲InstantInstant類表示UTC中時間軸上的一個時刻,分辨率爲nanoseconds。這意味着最多九(9)位小數部分。

Instant instant = Instant.parse("2000-01-01T10:00:00Z"); 

Instant類只是Java中的基本構建塊類。欲瞭解更多的靈活性,我們應該:

有什麼區別?時區是偏移量一組處理異常的規則,如Daylight Saving Time (DST)

OffsetDateTime

所以,如果你真的想時間的天這一刻在UTC看到的,然後分配UTC(ZoneOffset.UTC)的偏移得到一個OffsetDateTime,然後提取LocalTime對象。 LocalTime代表沒有日期且沒有時區的時間。

OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC); 
LocalTime lt = odt.toLocalTime(); // 10:00:00 

ZonedDateTime

如果你想通過其他時區的鏡頭,看看同一時刻,看到該特定區域的wall-clock time,指定ZoneId。例如,在魁北克同一時刻,在UTC的之後將有5小時

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); // 2000-01-01T05:00:00-05:00[America/Montreal] 
LocalTime lt = zdt.toLocalTime(); // 05:00:00 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了令人討厭的舊日期時間類,例如java.util.Date,.Calendar,& java.text.SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

大部分的java.time功能後移植到Java 6 和ThreeTenABP還適於Android(見How to use…)。

ThreeTen-Extra項目擴展java.time與其他類。這個項目是未來可能增加java.time的一個試驗場。