采用灵活的默认值,更好的解决方案(今天而不是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'。 –