2017-05-22 39 views
-1

下面是我輸入的日期字符串格式:與GMT導致小時變化的時區差異?

2025-08-08T15%3A41%3A46 

我要在上面的格式字符串轉換日期如下圖所示:

Fri Aug 08 15:41:46 GMT-07:00 2025 

而且我得到了下面的代碼:

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US); 
String decodedDate = URLDecoder.decode("2025-08-08T15%3A41%3A46", "UTF-8"); 
Date date = dateParser.parse(decodedDate); 

//Decode the given date and convert to Date object 
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy", Locale.US); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT-07:00")); 

System.out.println(sdf.format(date)); 

這就是它在控制檯上打印的內容。我不知道爲什麼它打印出不同的小時值,與我在上面輸出的結果相比較。它應該打印出15但它正在打印03

Fri Aug 08 03:41:46 GMT-07:00 2025 

我不確定什麼原因導致小時由於與GMT的時區差異而發生變化?

回答

2

除了在第一種格式中使用「HH」表示小時爲「白天(0-23)」,第二種格式使用「hh」表示「小時在am/pm 1-12)」。

0

由於the other Answer正確指出,您的格式化模式使用了不正確的字符。

讓我們看看另一種現代方法。

ISO 8601

你輸入的字符串,解碼一次恢復冒號,是標準ISO 8601格式。

URLDecoder.decode("2025-08-08T15%3A41%3A46", "UTF-8") 

2025-08-08T15:41:46

使用java.time

您正在使用舊麻煩日期時間類,現在的傳統,由java取代。時間課程。

解析/生成字符串時,java.time類默認使用ISO 8601

您的輸入字符串缺少偏移UTC或時區的任何指示。所以我們解析爲LocalDateTime

LocalDateTime ldt = LocalDateTime.parse("2025-08-08T15:41:46") 

ldt.toString():2025-08-08T15:41:46

如果您知道預期的時區,指派ZoneId產生ZonedDateTime

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Montreal")) ; 

zdt.toString():2025-08-08T15:41:46-04:00 [美國/蒙特利爾]


關於Java。時間

java.time框架內置於Java 8及更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

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

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

+0

我仍在使用java 7,無法切換到Java8。考慮到這一點,那麼最好的方法是什麼,並獲得我需要的相同輸出? – john

+0

@david在[*** ThreeTen-Backport ***](http://www.threeten.org/threetenbp/)項目中,大部分java.time功能都被移植到Java 6和Java 7中。由構建java.time和Joda-Time的相同團隊生成。很值得爲你的項目添加一個庫的麻煩。遺留類是不幸的。 –