我需要解析一个字符串到目前为止。问题是该字符串具有随机数的分秒。更准确地说,位数在0到7之间变化。为了测试这个,我编写了以下场景:
public static void main(String[] args) throws ParseException {
// printDate("2016-02-10T12:48:08.632746Z");
printDate("2016-02-10T12:48:08.632Z");
}
private static void printDate(String datumAsString) throws ParseException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
System.out.println(LocalDateTime.parse(datumAsString, formatter));
}
注释行不起作用(它抛出ParseException)。你知道如何解决这个问题吗?
答案 0 :(得分:2)
假设秒后的数字代表一小部分秒而不是毫秒数,则两个字符串都可以解析"本地"按ZonedDateTime
- 所以你可以写:
private static void printDate(String datumAsString) throws ParseException {
LocalDateTime ldt = ZonedDateTime.parse(datumAsString).toLocalDateTime();
System.out.println(ldt);
}
您可能还想坚持使用ZonedDateTime
而不是忽略时区信息。
答案 1 :(得分:0)
其中一个解决方案是强制您的功能在给定长度后修剪掉所有额外的数字。
显然,如果你不需要扩展精度。
例如,
String datumAsString = "2016-02-10T12:48:08.632746Z";
int position = datumAsString.lastIndexOf(".");
String head = datumAsString.substring(0,position);
String tail = datumAsString.substring(position);
String trimmedDate = null;
if(tail.length() > 5) {
trimmedDate = head + tail.substring(0,4) + "Z";
} else {
char[] chr = new char[5 - tail.length()];
Arrays.fill(chr, '0');
trimmedDate = head + tail.substring(0, tail.length() - 1) + new String(chr) + "Z";
}
System.out.println(trimmedDate);
输出:
2016-02-10T12:48:08.632Z
以下是代码段:
private static void printDate(String datumAsString) throws ParseException {
DateTimeFormatter ft = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
/* Set Milliseconds Precision (3) */
int position = datumAsString.lastIndexOf(".");
String head = datumAsString.substring(0,position);
String tail = datumAsString.substring(position);
String trimmedDate = null;
if(tail.length() > 5) {
trimmedDate = head + tail.substring(0,4) + "Z";
} else {
char[] chr = new char[5 - tail.length()];
Arrays.fill(chr, '0');
trimmedDate = head + tail.substring(0, tail.length() - 1) + new String(chr) + "Z";
}
/* Format Date */
System.out.println(LocalDateTime.parse(trimmedDate, ft));
}