由strftime生成的SimpleDateFormat解析日期的问题

时间:2013-06-12 22:13:25

标签: java python timestamp simpledateformat strftime

我有一个时间戳字符串 由2013-03-01T11:22:18.01Z生成的strftime("%Y:%m:%dT%H:%M:%SZ"),在Python中。

现在我正在尝试使用Java的SimpleDateFormat来解析此时间戳。我发现的很多示例代码似乎都是这样做的:

String DATE_FORMAT = "YYYY-MM-DD'T'hh:mm:ss.ssZ"
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT)
sdf.setLenient(false)
sdf.parse(timestamp) <---- throws ParseException here

但是,我得到一个错误对话框 Unparseable date: "2013-03-01T11:22:18.01Z"

我一直在调整DATE_FORMAT,尝试各种各样的事情,但我现在已经被困在同一个障碍上了很长一段时间。看起来我需要借用stackoverflow社区的力量。

2 个答案:

答案 0 :(得分:1)

1)2013-03-01T11的正确模式:22:18.01是"yyyy-MM-dd'T'HH:mm:ss.SSS"(如果.01是毫秒)

2)2013-03-01T11:22:18.01Z中的Z时区无法由仅接受-0800格式(RFC 822)的SimpleDateFormat'Z'解析。即使你把它改成'z'(一般时区)它仍然不会解析Z,它应该是GMT

请参阅SimmpleDateFormat API。

3)2013-03-01T11:22:18.01Z看起来非常像XSD日期时间格式http://www.schemacentral.com/sc/xsd/t-xsd_dateTime.html,可以使用java.xml.bind包(Java标准库)中的DatatypeConverter.parseDateTime进行解析

答案 1 :(得分:1)

除了yyyy vs YYYYddDD之外,Z也会导致问题。您的SimpleDateFormat的图案类似

yyyy-MM-dd'T'HH:mm:ss.ssZ
 |   |  |  | |  |  |  | |
 |   |  |  | |  |  |  | -----timezone (RFC 822 time zone, ex: -0800)
 |   |  |  | |  |  |  -------seconds again (maybe you wanted SS for milliseconds)
 |   |  |  | |  |  ----------seconds (0-59)
 |   |  |  | |  -------------minutes (0-59)
 |   |  |  | ----------------hours (0-23)
 |   |  |  ------------------the character T
 |   |  ---------------------day in month 
 |   ------------------------month in year
 ----------------------------year

但是你传递的字符串"2013-03-01T11:22:18.01Z",最后只有一个Z,而不是时区。

如果您实际上期望最后有Z,那么您需要以格式字符串引用它:

yyyy-MM-dd'T'HH:mm:ss.ss'Z'

就像你对T所做的那样。来自javadoc

  

可以使用单引号(')引用文本以避免解释。