我有以下日期:2011-08-12T20:17:46.384Z。这是什么格式?我试图用Java 1.4通过DateFormat.getDateInstance().parse(dateStr)来解析它
java.text.ParseException: Unparseable date: "2011-08-12T20:17:46.384Z"
我认为我应该使用SimpleDateFormat进行解析,但我必须首先知道格式字符串。到目前为止,我只有yyyy-MM-dd,因为我不知道T在这个字符串中是什么意思——与时区相关的东西?这个日期字符串来自文件CMIS下载历史媒体类型上显示的lccmis: downloaddon标记。
@John-Skeet给了我解决这个问题的线索。作为一个年轻的程序员,这个小问题很容易被忽略,也很难被诊断出来。所以我分享它,希望它能帮助别人。
我的问题是,我想从一个我没有影响力的JSON中解析以下包含时间戳的字符串,并将其放在更有用的变量中。但是我总是出错。
因此,给定以下条件(注意ofPattern()中的字符串参数;
String str = "20190927T182730.000Z"
LocalDateTime fin;
fin = LocalDateTime.parse( str, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ") );
错误:
Exception in thread "main" java.time.format.DateTimeParseException: Text
'20190927T182730.000Z' could not be parsed at index 19
这个问题?图案结尾的Z需要像“T”一样用“Z”来包装。改变
“名称不'HHmmss。SSSZ"到"yyyyMMdd'T'HHmmss。SSS' z '”,它起作用了。
从图案中完全去掉Z也会导致错误。
坦率地说,我希望Java类能够预料到这一点。
除了第一个答案,还有其他方法来分析它。解析方法:
(1)如果你想获取日期和时间的信息,你可以将它解析为一个ZonedDatetime(自Java 8以来)或date(旧)对象:
// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);
or
// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";
// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);
Date myDate = df.parse("2011-08-12T20:17:46.384Z");
(2)如果你不关心日期和时间,只想把信息当作以纳秒为单位的时刻,那么你可以使用Instant:
// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
@John-Skeet给了我解决这个问题的线索。作为一个年轻的程序员,这个小问题很容易被忽略,也很难被诊断出来。所以我分享它,希望它能帮助别人。
我的问题是,我想从一个我没有影响力的JSON中解析以下包含时间戳的字符串,并将其放在更有用的变量中。但是我总是出错。
因此,给定以下条件(注意ofPattern()中的字符串参数;
String str = "20190927T182730.000Z"
LocalDateTime fin;
fin = LocalDateTime.parse( str, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ") );
错误:
Exception in thread "main" java.time.format.DateTimeParseException: Text
'20190927T182730.000Z' could not be parsed at index 19
这个问题?图案结尾的Z需要像“T”一样用“Z”来包装。改变
“名称不'HHmmss。SSSZ"到"yyyyMMdd'T'HHmmss。SSS' z '”,它起作用了。
从图案中完全去掉Z也会导致错误。
坦率地说,我希望Java类能够预料到这一点。
如果你正在寻找Android的解决方案,你可以使用下面的代码从时间戳字符串中获取纪元秒。
public static long timestampToEpochSeconds(String srcTimestamp) {
long epoch = 0;
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
Instant instant = Instant.parse(srcTimestamp);
epoch = instant.getEpochSecond();
} else {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'", Locale.getDefault());
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse(srcTimestamp);
if (date != null) {
epoch = date.getTime() / 1000;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return epoch;
}
样品输入:2019-10-15T05:51:31.537979Z
样本输出:1571128673