2017-07-07 33 views
1

我需要格式化字符串格式爲這樣的日期:2017-06-14T00:00:00Z我想在日期字符串中得到DateTimeFormatter約達時間

目前,我有:

DateTimeFormatter DT_SCHEDULE_FORMATTER_START_TIME = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ"); 

如果我解析字符串2017-06-14T00:00:00Z這個問題,它給了我在UTC正確的時間。

但是,當我把一個DateTime對象,並儘量做到:

String strNow = new DateTime().toString(DT_SCHEDULE_FORMATTER_START_TIME); 

我得到類似2017-06-14T00:00:00 -07:00

我看過的文檔中,似乎無法找到合適的格式化字符串。

回答

1

這是因爲DateTime() constructor uses your system's default timezone和格式化程序prints the timezone offset中的Z模式。

系統的默認時區偏移量爲-07:00,這就是爲什麼你會得到這個輸出。

如果你想正好與Z到底輸出,必須將DateTime對象轉換爲org.joda.time.Instant

String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString(); 

strNow2017-06-14T00:00:00.000Z

如果你想在UTC當前時間(而不是解析String),你必須明確地告訴DateTime構造函數使用UTC,使用new DateTime(DateTimeZone.UTC)


上面的代碼還會打印毫秒。如果你不希望這樣,另一種選擇是使用DateTimeFormatterBuilder

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .appendPattern("yyyy-MM-dd'T'HH:mm:ss") 
    // append Z if offset is zero (UTC) 
    .appendTimeZoneOffset("Z", true, 2, 2) 
    // create formatter 
    .toFormatter(); 
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString(formatter); 

這將格式化日期accordinlgy(沒有毫秒):

2017-06-14T00:00:00Z

1

你可以嘗試使用parseDateTime功能

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ"); 
DateTime dateTime = f.parseDateTime("2017-06-14T00:00:00Z"); 

希望這將有助於。

1

「Z」 在格式是RFC 822時區

對於格式化,如果偏移VALU來自格林威治標準時間的是0,產生「Z」。如果 模式字母的數量是1,則任何一小時的小數部分都會被忽略 。

對於解析,「Z」被解析爲UTC時區指示符。一般 時區不被接受。

如果你想獲得UTC字符串 - 你應該強制時區:

DateTime dateTime = new DateTime(DateTimeZone.UTC); 
String strNow = dateTime.toString(DT_SCHEDULE_FORMATTER_START_TIME);