扩展@Tom的答案:
问题
硬编码“Z”时,您假设所有日期都保存为 UTC - 不一定是这种情况。
问题是 SimpleDateFormat 不能将文字识别'Z'
为 UTC '-0000' 偏移量的别名(无论出于何种原因,因为它声称符合 ISO-8601)。
所以你不能做
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
因为这错误地假设所有日期都将始终以 UTC 编写,但你不能这样做
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
或者,因为这将无法解析出现文字“Z”的日期。
解决方案 1:使用 javax.xml.bind.DatatypeConverter
这个数据类型转换器实际上是符合 ISO8601 的,并且可以像使用一样简单
import javax.xml.bind.DatatypeConverter;
public Long isoToMillis(String dateString){
Calendar calendar = DatatypeConverter.parseDateTime(dateString);
return calendar.getTime().getTime();
}
如果您仍然使用 JAXB,那将是可行的方法。
解决方案 2:使用条件格式
final static String ZULUFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
final static String OFFSETFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
/* This is a utility method, so you want the calling method
* to be informed that something is wrong with the input format
*/
public static Long isoToMillis(String dateString) throws ParseException{
/* It is the default, so we should use it by default */
String formatString = ZULUFORMAT;
if(! dateString.endsWith("Z") ) {
formatString = OFFSETFORMAT;
}
SimpleDateFormat sd = new SimpleDateFormat(formatString);
return sd.parse(dateString).getTime();
}
如果您还没有使用 JAXB,您可能希望将此方法放入实用程序类中。