使用随机数的秒数格式化日期

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 而不是忽略时区信息。