![](/img/trans.png)
[英]Date formats difference between yyyy-MM-dd'T'HH:mm:ss and yyyy-MM-dd'T'HH:mm:ssXXX
[英]Date conversion from yyyy-MM-dd HH:mm:ss to ISO date yyyy-MM-dd'T'HH:mm:ssXXX format issue
我正在嘗試將日期格式從yyyy-MM-dd HH:mm:ss轉換為ISO日期格式yyyy-MM-dd'T'HH:mm:ss + 5:30,並通過以下代碼對其進行了測試,在Eclipse上運行時工作正常,並導致通過jar部署到服務器時出現問題。
問題是日期(輸入:2016-01-08 10:22:03)轉換為2016-01-08T10:22:03Z而不是2016-01-08T10:22:03 + 5:30。
注意:我正在使用Java 8。
以下是用於轉換日期的代碼,
SimpleDateFormat outputDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
SimpleDateFormat inputDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String FinalDate = outputDate.format(inputDate.parse(pickupDate));
System.out.println(finalDate);
其他奇怪的經驗是,在某些計算機上該問題無法重現,而在某些計算機上存在該問題。 是某種依賴於機器還是JVM的東西? 請幫忙。
先感謝您。
如SimpleDateFormat的文檔所示:
對於格式化,如果距GMT的偏移值為0,則生成“ Z”。 如果圖案字母的數量為1,則忽略一小時的任何分數。 例如,如果模式為“ X”且時區為“ GMT + 05:30”,則會生成“ +05”。
因此,我的猜測可能是檢查服務器的時區。 由於它認為輸入日期的時區為GMT 0。
如果使用Java 8或更高版本,則應使用java.time類,而不要使用那些臭名昭著的日期時間類java.util.Date/.Calendar。
您的輸入字符串接近標准ISO 8601格式。 解析和生成日期時間值的文本表示時,默認情況下,java.time類使用這些標准格式。 無需為此類標准輸入定義編碼的解析模式。
要完全符合ISO 8601,請將中間的SPACE替換為T
String inputStandardized = "2016-01-08 10:22:03".replace( " " , "T" );
該字符串沒有自UTC偏移量或時區,因此我們首先創建一個LocalDateTime
。
LocalDateTime localDateTime = LocalDateTime.parse( inputStandardized );
這些對象是日期時間的模糊概念,但實際上不在時間軸上。 要在時間線上定義實際時刻,我們必須應用時區。
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = localDateTime.atZone( zoneId );
請注意,特定的日期和時間在指定的時區可能無效; java.time會根據需要進行調整。 請務必閱讀文檔以了解調整行為。
默認情況下, ZonedDateTime
上的toString
方法以ZonedDateTime
的格式生成一個String,除了擴展為將時區的名稱附加在方括號中。
String output = zdt.toString();
2016-01-08T10:22:03 + 05:30 [亞洲/加爾各答]
這種擴展包括時區名稱是很有意義的。 時區不僅是與UTC的偏移量,還包括處理異常的當前和歷史規則,例如夏令時(DST)。
如果您確實不希望添加該時區名稱,則可以按照我的建議使用可以在java.time中定義為常量的備用格式設置模式ISO_OFFSET_DATE_TIME
。
DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME ;
String output = zdt.format( formatter );
2016-01-08T10:22:03 + 05:30
順便說一句,您可以通過在與UTC的偏移量中始終添加前導填充零來避免問題。 因此,請使用+05:30
而不是問題中所示的+5:30
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.