如何从字符串"06.03.2018 06:00 CET"获取ZonedDateTime或OffsetDateTime?
嘿,我一眼就看到问题出在哪了!你的代码里有两个关键错误导致了解析失败,咱们一步步来修正:
问题1:错误的年份格式符YYYY
你用的YYYY是周基年份(ISO周日期系统里的年份),它和我们日常用的公历年yyyy不是一回事。比如12月底的某些日期,周基年可能会算到下一年,而1月初的可能算到上一年,这就导致Java无法把你的日期字符串和周基年匹配,直接抛出异常。
问题2:时区缩写CET需要Locale支持
Java的DateTimeFormatter默认Locale可能不是欧洲地区的,这会导致它无法识别CET(中欧时间)这种地区性的时区缩写。咱们需要指定一个欧洲的Locale来让解析器正确识别这个时区。
修正后的代码
把YYYY改成yyyy,再加上合适的Locale,代码就能正常运行了:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class DateTimeParser { public static void main(String[] args) { // 修正年份格式为yyyy,指定德国Locale以识别CET时区 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z", Locale.GERMANY); ZonedDateTime zdt = ZonedDateTime.parse("06.03.2018 06:00 CET", dtf); System.out.println(zdt); // 输出类似:2018-03-06T06:00+01:00[Europe/Berlin] } }
额外说明
如果你想解析成OffsetDateTime,其实也可以用同样的格式化器,只需要把ZonedDateTime.parse换成OffsetDateTime.parse就行。不过ZonedDateTime更适合处理像CET这种有夏令时切换的时区,因为它会保留时区的规则信息。
内容的提问来源于stack exchange,提问作者gknauth
相关产品推荐
相关产品推荐

