簡體   English   中英

為什么我會收到無法解析的日期異常?

[英]Why am I getting an unparseable date exception?

我無法使用SimpleDateFormat解析日期。 我試過這段代碼:

SimpleDateFormat fechas = new SimpleDateFormat("dd/MM/yyyy hh:mm");

if (data[i].length() > 1) {
    Date f = (Date) fechas.parse(data[i]);
    System.out.println(i + " " + f);
}

我收到以下錯誤:

Exception in thread "main" java.text.ParseException: Unparseable date: "01/06/2015 8:20

我使用以下代碼再次遇到同樣的問題:

SimpleDateFormat fech = new SimpleDateFormat(" yyyy/MM/dd HH:mm:ss");
Date date = (Date) fech.parse(data[i]);
System.out.println(date);

這給出了錯誤

Exception in thread "main" java.text.ParseException: Unparseable date: "00015/06/01  08:20:15"

我該如何解決這個問題?

使用SimpleDateFormat ,日期格式必須完全匹配。 在您的示例中,您包括日期,但在日期格式中,您還指定了小時和分鍾。 如果您的數據有該文本,它將起作用。 例如,使用您的第一個示例:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class DateDemo {
  public static void main(String args[]) throws Exception {
    String yourData = "01/06/2015";
    String matchingData = "01/06/2015 13:00";
    SimpleDateFormat fechas = new SimpleDateFormat("dd/MM/yyyy hh:mm");

    Date matchingDate = fechas.parse(matchingData);
    System.out.println("String: \"" + matchingData + "\" parses to " + matchingDate);
    Date yourDate = fechas.parse(yourData);
    System.out.println("String: \"" + yourData + "\" parses to " + yourDate);
  }
}

這輸出:

String: "01/06/2015 13:00" parses to Mon Jun 01 13:00:00 CDT 2015
Exception in thread "main" java.text.ParseException: Unparseable date: "01/06/2015"
        at java.text.DateFormat.parse(DateFormat.java:366)
        at Demo.main(Demo.java:14)

TL;博士

我該如何解決這個問題?

將格式模式與輸入匹配。

LocalDateTime.parse( 
    "01/06/2015 8:20" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu H:m" )
)
.toString()

2015-06-01T08:20

java.time

正如其他人所說,您的格式化模式無法與您的字符串輸入匹配。

此外,您正在使用java.time類多年前取代的麻煩的舊日期時間類。

您的時間小時缺少填充零。 所以你應該使用一個h而不是兩個hh 此外,小寫h表示12小時制,由於缺少AM / PM指示,您的輸入似乎是24小時制。 所以大寫的H是有序的。

String input = "01/06/2015 8:20" ;  // Notice the lack of a padding zero on the hour.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu H:m" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString():2015-06-01T08:20


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

您可以直接與數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

日期String以及SimpleDateFormat()應匹配: -

SimpleDateFormat("dd/MM/yyyy hh:mm")將適用於01/06/2015 2:24

SimpleDateFormat("yyyy/MM/dd HH:mm:ss")將適用於2015/06/01 08:20:15

有關完整列表,請參閱此處的官方Oracle Doc

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {
    public static void main(String[] args) {
        String dateText = "18/07/2015 05:30";        
        DateFormat fechas = new SimpleDateFormat("dd/MM/yyyy hh:mm");
        try {
            Date parse = fechas.parse(dateText);
            System.out.println("Date : " + fechas.format(parse));
        } catch (ParseException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
}

我喜歡這個源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM