雖然其他答案是正確的,但答案和你的問題都工作太辛苦。
ISO 8601格式
有問題的字符串的格式, 「2014-04-10T00:00:00.000」,是標準ISO 8601格式。 Joda-Time中的DateTime類具有內置的內置ISO 8601解析器/格式器,默認情況下使用。所以不需要實例化格式化程序。僅僅將字符串傳遞給構造函數DateTime。
時區
指定由一個時區來解釋日期時間值。否則,應用JVM當前的默認時區。
實施例:
DateTimeZone timeZoneMontréal = DateTimeZone.forID("America/Montreal");
示例代碼
使用Joda-Time 2.5一些示例代碼。
DateTime dateTime = new DateTime("2014-04-10T00:00:00.000", DateTimeZone.UTC);
如果串表示在Québec而非UTC壁時間†片刻,然後通過指定該字符串應該在解析可以理解,時區。
DateTime dateTime = new DateTime("2014-04-10T00:00:00.000", timeZoneMontréal);
按照註釋,你可能更願意指定傳入字符串的預期格式。 Joda-Time有許多預先定義的formatters內置的,以及允許你定義你自己的。在這種情況下,我們的字符串在末尾缺少時區偏移量,所以我們指定了格式化程序dateHourMinuteSecondFraction。
如果傳入的字符串格式不正確或使用意外的格式會怎麼樣?拋出異常。爲了健壯的代碼,陷入這個異常。
String input = "2014-04-10T00:00:00.000";
DateTimeZone timeZoneMontréal = DateTimeZone.forID("America/Montreal");
DateTimeFormatter formatter = ISODateTimeFormat.dateHourMinuteSecondFraction().withZone(timeZoneMontréal);
DateTime dateTime = null;
try {
dateTime = formatter.parseDateTime(input);
} catch (IllegalArgumentException e) {
System.out.println("Unexpected format of incoming date-time string: " + input + ". Exception: " + e); // Handle exception for bad input.
}
調整爲UTC進行比較。
DateTime dateTimeUtc = dateTime.withZone(DateTimeZone.UTC);
轉儲到控制檯。
System.out.println("dateTime: " + dateTime);
System.out.println("dateTimeUtc: " + dateTimeUtc);
運行時。
dateTime: 2014-04-10T00:00:00.000-04:00
dateTimeUtc: 2014-04-10T04:00:00.000Z
†牆時間=爲通常出現在一些時鐘在一些地方一些牆上的時間。
我已經用Joda-Time 2.1測試了你的代碼,它工作正常。解釋Z.沒問題,您使用的是哪種版本的Joda-Time? –
我正在使用1.6.2 – user2810351