使用随机数的秒数格式化日期
Format date with random number of split seconds
我需要解析一个字符串到日期。问题是该字符串具有随机数的分秒。更准确地说,位数在 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)。你知道如何解决这个问题吗?
其中一个解决方案是强制您的函数 trim 关闭给定长度后的所有额外数字。
显然,如果您不需要扩展精度。
例如,
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));
}
假设秒后的数字代表秒的一小部分而不是毫秒数,两个字符串都可以通过 ZonedDateTime
解析 "natively" - 所以你可以写:
private static void printDate(String datumAsString) throws ParseException {
LocalDateTime ldt = ZonedDateTime.parse(datumAsString).toLocalDateTime();
System.out.println(ldt);
}
您可能还想坚持使用 ZonedDateTime
而不是忽略时区信息。
我需要解析一个字符串到日期。问题是该字符串具有随机数的分秒。更准确地说,位数在 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)。你知道如何解决这个问题吗?
其中一个解决方案是强制您的函数 trim 关闭给定长度后的所有额外数字。
显然,如果您不需要扩展精度。
例如,
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));
}
假设秒后的数字代表秒的一小部分而不是毫秒数,两个字符串都可以通过 ZonedDateTime
解析 "natively" - 所以你可以写:
private static void printDate(String datumAsString) throws ParseException {
LocalDateTime ldt = ZonedDateTime.parse(datumAsString).toLocalDateTime();
System.out.println(ldt);
}
您可能还想坚持使用 ZonedDateTime
而不是忽略时区信息。