SimpleDateFormat给出的未来日期是格式化的日期[重复]

问题描述 投票:0回答:1
    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正在生成Future Date。可能是什么原因呢?

java date simpledateformat
1个回答
1
投票

12:58:04.517123+05:30 517123被认为是毫秒,翻译过来大概是8分37秒。这就是你的时间变化的原因。Date的另一个重要方面是,它没有时区的概念,它只是告诉你从纪元开始的毫秒数,所以当你做toString()时,它显示的时间是JVM时区。所以当你做toString()的时候,它会以JVM时区显示时间。


2
投票

如果你可以使用 "toString() "来显示JVM时区的时间。java.time 的模式,这样做。就像 @BasilBorque 给出的答案一样,或者提供一个模式,解析出 String直接使用给定格式的s,而不需要将空白处用 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

并可通过多种方式进行格式化。


2
投票

java.time.OffsetDateTime

你有一个输入和一个格式化模式,两者都使用了 微秒. 该 Date 类型仅限于 毫秒.

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

编辑您的输入文本,使其符合ISO 8601标准。将中间的空格替换为 T.

String input = "2020-05-22 12:58:04.517123+05:30".replace( " " , "T" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
© www.soinside.com 2019 - 2024. All rights reserved.