SimpleDateFormat 将未来日期作为格式化日期

SimpleDateFormat is giving future date as formatted Date

    String timestamp = "2020-05-22 12:58:04.517123+05:30"; 
    Date d = null;
    try {
        d = ext.parse(timestamp);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } */
    Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse(timestamp);
    System.out.println(date);
    // o/p : Fri May 22 13:06:41 IST 2020

我们可以看到 SimpleDateFormat 正在生成未来日期。可能是什么原因?

java.time.OffsetDateTime

您有一个输入和格式模式都使用 microseconds. The Date type is limited to milliseconds

你不应该使用可怕的 DateSimpleDateFormat 类。仅使用 java.time 类.

编辑您的输入文本以符合 ISO 8601 标准。把中间的SPACE换成T.

String input = "2020-05-22 12:58:04.517123+05:30".replace( " " , "T" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

12:58:04.517123+05:30 中,517123 被认为是毫秒,大约相当于 8 分 37 秒。这就是你的时间在改变的原因。 Date 的另一个重要方面是它没有时区的概念,它只是告诉没有。从纪元开始的毫秒数。因此,当您执行 toString() 时,它会以 JVM 时区显示时间。

如果你能用 java.time 做到这一点,那就去做吧。像@BasilBorque 给出的答案那样做,或者提供一种模式,直接解析给定格式的 Strings,而不用 T 替换空格以使其成为 ISO 模式:

public static void main(String[] args) {
    String timestamp = "2020-05-22 12:58:04.517123+05:30";
    // parse the string to an OffsetDateTime using a matching pattern
    OffsetDateTime odt = OffsetDateTime.parse(timestamp,
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSXXXXX"));
    // print the result in the default (ISO) pattern
    System.out.println(odt);
}

结果看起来像

2020-05-22T12:58:04.517123+05:30

并且可以通过多种不同的方式进行格式化。