簡體   English   中英

SimpleDateFormat:意外結果和意外解析異常

[英]SimpleDateFormat: unexpected results and unexpected parse exceptions

我在使用簡單的日期格式時遇到了很大的困難。 首先,我知道並不是所有站點上的所有教程實際上都不錯,但是所有非平凡格式(非dd / MM / yyyy)都給出了解析異常(加上我自己的測試無法按預期進行)的事實令我沮喪

這是有問題的網站: http : //www.mkyong.com/java/how-to-convert-string-to-date-java/

而且我不明白為什么會這樣簡單:

private static void unexpectedFailure() {
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
    String dateInString = "7-Jun-2013";

    try {

        Date date = formatter.parse(dateInString);
        System.out.println(date);
        System.out.println(formatter.format(date));

    } catch (ParseException e) {
        e.printStackTrace();
    }
}

引發解析異常。

此外,我正在嘗試解析自己的日期。 這段代碼給出了奇怪的結果(我會說意想不到的):

public static void doSomething(List<String> list) { 
    Iterator<String> iter = list.iterator();
    String[] line = iter.next().split(" ");
    System.out.println(Arrays.toString(line));
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
    format.setLenient(true);


    try {
        System.out.println(line[0]+" "+line[1]);
        System.out.println(format.parse(line[0]+" "+line[1]));
    } catch (ParseException e) {
        System.out.println("In theory this should not get caught.");
    }
}

打印輸出:

[06/08/2015, 13:51:29:849, DEBUG, etc...]
06/08/2015 13:51:29:849
Thu Aug 06 13:51:29 EEST 2015

Thu Aug 06 13:51:29 EEST 2015什么? 為什么?

編輯,我會盡力解釋。 在我的最后一個代碼片段中,我只是嘗試確定字符串是否為日期,並且該字符串通過了“測試”。 但是,當我將其打印出來時,格式簡直就是奇怪。 我開始認為那是因為我正在打印日期。 我什至可以打印DateFormat? 我期望的是dd/MM/yyyy hh:mm:ss不是ddd MMM 06? hh:mm:ss G YYYY ddd MMM 06? hh:mm:ss G YYYY

而且我不明白為什么會這樣簡單:
(代碼被截斷)
引發解析異常。

我的猜測是它超出了Jun ,這在您的系統默認語言環境中可能不是有效的月份縮寫。 我建議您在SimpleDateFormat構造函數中指定語言環境:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);

然后,您要處理的語言環境肯定Jun為一個月的縮寫。

就是說,我建議盡可能使用數字格式,最好是遵循ISO-8601的格式,例如

yyyy-MM-dd'T'HH:mm:ss

但是,當我將其打印出來時,格式簡直就是奇怪。

不,這不對。 您正在有效地使用

Date date = format.parse(line[0]+" "+line[1]);
System.out.println(date);

因此,它稱為Date.toString()記錄為:

將此Date對象轉換為以下形式的字符串:

 dow mon dd hh:mm:ss zzz yyyy 

這樣就可以正常工作了。 但是,您想使用SimpleDateFormat 格式化日期-因此您需要調用format

System.out.println(format.format(date));

當然,基本上只是檢查它是否可以往返。

附帶說明一下,我懷疑您要在格式字符串中使用HH (24小時制)而不是hh (12小時制)。

暫無
暫無

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

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