在java中将"27-11-17 02:13:17.921000000 PM"解析为"dd-MM-yy hh:mm:ss.S a"



我在以下代码中遇到错误的输出。

String str = "27-11-17 02:13:17.921000000 PM";
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yy hh:mm:ss.S a");
System.out.println(sdf.parse(str).toString());

有什么问题。

您的问题是SimpleDateFormat类可以抛出检查的异常,即'ParseException',然后您的方法需要确认您的函数来编译。请参阅下面。

import java.text.SimpleDateFormat;
import java.text.ParseException;
public class Main {
     public static void main(String[] args) throws ParseException {
        String str = "27-11-17 02:13:17.921000000 PM";
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yy hh:mm:ss.S a");
        System.out.println(sdf.parse(str).toString());
    }
}

这应该对您有用。

每个人都已经提到921000000不是小数秒的小数,而是毫秒的数量(由"国际标准)。不幸的是,Java将溢出传播到几秒钟,等等。

解决方案是将"毫秒"部分解释为十进制分数,并截断它:

String str = "27-11-17 02:13:17.921000000 PM";
str = str.replaceFirst("(\.\d{3})\d+", "$1");
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yy hh:mm:ss.S a");
System.out.println(sdf.parse(str).toString());

这仍然会留下.9作为9毫秒;如果您只想将其保留为.009,请进行第二次替换:

str = str.replaceFirst("\.(\d{2})\b", ".0$1")
         .replaceFirst("\.(\d)\b", ".00$1");

,这有点奇怪。它预计将有3毫秒。921000000被视为所说的921,000,000毫秒或10天以上。因此,它可以解析日期,然后将921000000毫秒添加到12月8日。该代码获得了我期望的日期。

str = "27-11-17 02:13:17.921000000 PM";
str = str.substring(0, 21) + str.substring(27,30);
sdf = new SimpleDateFormat("dd-MM-yy hh:mm:ss.S a");
System.out.println(sdf.parse(str).toString());

最新更新