我有一个时间戳字符串
由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社区的力量。
答案 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 YYYY
和dd
与DD
之外,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:
可以使用单引号(')引用文本以避免解释。