那是因为您要告诉解析器忽略
Z,或者说是按字面值匹配,而不是处理它的 意思 。
输入字符串是
Instant值,因此解析为
Instant, 然后 应用时区。
如果您没有兼容Java
8+的Android,请使用ThreeTenABP。
String stTime = "2018-10-17T22:00:00Z";ZonedDateTime time = Instant.parse(stTime).atZone(ZoneId.of("America/New_York"));System.out.println(time); // prints: 2018-10-17T18:00-04:00[America/New_York]如果您更喜欢使用过时的
SimpleDateFormat,只需使用正确的格式,而不指定时区。
SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");Date startDate = formatStart.parse(stTime);// My default time zone is America/New_York, so:System.out.println(startDate); // prints: Wed Oct 17 18:00:00 EDT 2018startDate.getTime()是您需要的时间。
对于<24级的API,格式模式
X不起作用,因此您需要
Z像问题中那样进行硬编码,但是要告诉解析器它采用UTC,因为这就是
Z时区的含义。
SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");formatStart.setTimeZone(TimeZone.getTimeZone("UTC"));Date startDate = formatStart.parse(stTime);// My default time zone is America/New_York, so:System.out.println(startDate); // prints: Wed Oct 17 18:00:00 EDT 2018


