Java字符串转日期,DateFormat无效

3

我有点难以将下面格式的字符串转换为日期。一直抛出ParseException异常。

字符串:2015-11-14 17:29:16.543934

我已经在这里查找过了,特别是这个链接:Java string to date conversion,但是没有任何运气。

以下是我的方法:

private Date parseTime(String input) {
    // input format: 2015-11-14 17:29:16.543934
    try {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssSSSSSS");
        Date date = format.parse(input);
        return date;
    } catch (ParseException e) {
        System.out.println("Could not parse time. ID: " + this.id);
    }
    return null;
}

编辑:

在我下面的答案中(声明我错过了秒和毫秒之间的".")Jon Skeet提出了一个非常好的观点:

"那仍然不能按照你期望的工作。它将把你的输入视为有543934毫秒...因此,它会解析为17:38:19。"

实际上,我不需要这种精度水平,所以我只是要切掉毫秒,但如果有人知道如何保持6位小数的精度,我会很感兴趣。


您可以使用Java-8(java.time包)或ThreetenBP(类似但是适用于Java-6+7的后移版本)或我的Time4J库来保持微秒精度。其他库和旧版JDK仅提供毫秒级精度。 - Meno Hochschild
5个回答

2

你在字符串格式中缺少了一个点:

ss.SSSSSS

它必须是这样的:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");

1
结果表明,这种方法行不通,原因是Jon Skeet提出的: “这仍然不能按您期望的那样工作。它将把您的输入视为具有543934毫秒...因此它将解析为17:38:19。” - JChristen
如果SimpleDateFormat强制解析纳秒,我听说它会像这样操作。例如, 2015-05-08 00:00:00.123456→2015-05-08 00:02:03.000456 - nariuji

0
原来我在秒和毫秒之间漏了一个“.”,所以新的DateFormat如下:
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");

请注意,毫秒只能有最多3位数字(毫 = 1000,即值从0到999)。 - Thomas
1
那仍然不能按照您的期望工作。它会将您的输入视为有543934毫秒......所以它将解析为17:38:19。 - Jon Skeet

0
声明这个:
 String tt = "2015-11-14 17:29:16.543934";
    TextView textt;

然后使用了这个:

             try{    
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
                    Date bod = format.parse(tt);
                    SimpleDateFormat rformat = new SimpleDateFormat("dd-MM-yyyy");
                    textt.setText(rformat.format(bod));
                }catch (ParseException pe){

                }

对于日期转换,您需要同时使用两种格式。

  1. 转换前的格式:"yyyy-MM-dd HH:mm:ss.SSSSSS"
  2. 转换后的格式:"dd-MM-yyyy"

0

SimpleDateFormat中的'S'代表毫秒,而微秒则没有对应的符号。

在Java 8中的DateTimeFormatter中,'S'表示小数部分,您可以轻松地进行字符串转换:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
LocalDateTime ldt = LocalDateTime.parse(input, dtf);
Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
return Date.from(instant);

0

日期不能使用纳秒,对吗?

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS000");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接