2015-09-04 170 views
2

解析时间,我下一个日期时间表示为字符串:"2015-08-21T22:00:00Z"如果我尝试用SimpleDateFormat的解析它没有设置时区,我收到奇怪的值:为什么SimpleDateFormat的需要时区设置为UTC

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 
sdf.parse("2015-08-21T22:00:00Z") // Fri Aug 21 22:00:00 CEST 2015 

它看起来像它会忽略Z - UTC指示符。 在另一方面,当我设置GMT时间eveything按预期工作:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")) 
sdf.parse("2015-08-21T22:00:00Z") // Sat Aug 22 00:00:00 CEST 2015 

为什么它是那样的工作?为什么我需要为SimpleDateFormat设置时区,即使该字符串包含UTC指示符?

+1

@Tunaki:这实际上是答案。随意发布它:-)。 – sleske

回答

4

SimpleDateFormat字符串中的单引号暗示它们是字符串文字。你已经正确地逃脱了'T',但是通过包装Z你告诉Java忽略了这个值。删除引号,或者按照手动方式手动设置时区。

2

问题是你没有告诉SimpleDateFormat该字符串有一个UTC指示符(你用'Z'转义了它)。

根据SimpleDateFormat Javadoc,ISO 8601 format获得X模式。因此下面将提供正确的输出:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); 
sdf.parse("2015-08-21T22:00:00Z"); // Sat Aug 22 00:00:00 CEST 2015 
相关问题