採用靈活的默認值,更好的解決方案(今天而不是1970-01-01)將在Java-8與新的內置日期時間庫位於包java.time
:
String input = "12:32:21 JST";
String pattern = "HH:mm:ss z";
LocalDate today = LocalDate.now(ZoneId.of("Asia/Tokyo"));
DateTimeFormatter dtf =
new DateTimeFormatterBuilder().parseDefaulting(ChronoField.YEAR, today.getYear())
.parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue()).parseDefaulting(
ChronoField.DAY_OF_MONTH,
today.getDayOfMonth()
).appendPattern(pattern).toFormatter(Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(input, dtf);
System.out.println(zdt); // 2016-12-23T12:32:21+09:00[Asia/Tokyo]
但是,我仍然看到一個小錯誤,這個錯誤與這個事實有關,因爲這個代碼在解析真實區域之前對使用區域做了硬連線的假設,所以請小心處理。請記住,當前日期取決於區域。但也許你只需要處理一個只有日本時間被用戶使用的場景。
提示:你也可以分兩步進行解析。第一步用任何一種固定的默認日期來獲取要解析的文本的區域信息。然後,您可以使用此區域信息獲取上述建議的解決方案。一個尷尬但安全的程序。
'SimpleDateFormat'不支持默認日期,或者換句話說:1970-01-01是唯一固定的缺省此格式化程序的日期。如果你希望有更多的靈活性,那麼你可以在Java-8中使用'DateTimeFormatter'。 –