2015-12-25 78 views
6

如果輸入是01-01-2015它應該更改爲2015-01-01
如果輸入是2015-01-01它應該更改爲01-01-2015
我用SimpleDateFormat但沒有得到正確的輸出:日期格式改變

//Class to change date dd-MM-yyyy to yyyy-MM-dd and vice versa 
public class ChangeDate { 
    static SimpleDateFormat formatY = new SimpleDateFormat("yyyy-MM-dd"); 
    static SimpleDateFormat formatD = new SimpleDateFormat("dd-MM-yyyy"); 

    //This function change dd-MM-yyyy to yyyy-MM-dd 
    public static String changeDtoY(String date) { 
    try { 
     return formatY.format(formatD.parse(date)); 
    } 
    catch(Exception e) { 
     return null; 
    } 
    } 

    //This function change yyyy-MM-dd to dd-MM-yyyy 
    public static String changeYtoD(String date) { 
    try { 
     return formatD.format(formatY.parse(date)); 
    } 
    catch(Exception e) { 
     return null; 
    } 
    } 
} 

我需要一些條件,可以自動檢測日期的模式,改變爲另一種格式。

+0

第一個連字符的位置可能是?根據所選擇的功能 – Henry

+1

獲得第一個連字符的發生... – Sreemat

回答

2

正則表達式是矯枉過正

對於日期時間的工作,沒必要和regex打擾。

只需嘗試使用一種格式進行解析,即可捕獲預期的異常。如果確實拋出異常,請嘗試使用其他格式進行解析。如果拋出異常,那麼您知道輸入意外地不是這兩種格式。

java.time

您正在使用現在內置到Java 8和後來的java.time框架取代了老麻煩的日期時間類。新課程的靈感來自非常成功的Joda-Time框架,作爲其後繼者,概念相似但重新設計。由JSR 310定義。擴展ThreeTen-Extra項目。請參閱Oracle Tutorial

LocalDate

新類包括一個,LocalDate,日期只值,而不時的一天。正是你需要的。

格式化程序

你的第一格式可以是標準ISO 8601格式,YYYY-MM-DD。這種格式在java.time中默認使用。

如果由於輸入與ISO 8601格式不匹配導致此第一次解析嘗試失敗,則會引發DateTimeParseException

LocalDate localDate = null; 
try { 
    localDate = LocalDate.parse(input); // ISO 8601 formatter used implicitly. 
} catch (DateTimeParseException e) { 
    // Exception means the input is not in ISO 8601 format. 
} 

其他格式必須由一個編碼模式指定,類似於您使用SimpleDateFormat進行的操作。因此,如果我們從第一次嘗試中捕捉到異常,請進行第二次解析嘗試。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate localDate = null; 
try { 
    localDate = LocalDate.parse(input); 
} catch (DateTimeParseException e) { 
    // Exception means the input is not in ISO 8601 format. 
    // Try the other expected format. 
    try { 
     localDate = LocalDate.parse(input , formatter); 
    } catch (DateTimeParseException e) { 
     // FIXME: Unexpected input fit neither of our expected patterns. 
    } 
} 
+1

使用異常處理非例外行爲(/用於流量控制)是非常糟糕的做法。 -1。 – XenoRo

+1

此處的異常處理是必需的,因爲所稱的核心Java方法聲明異常。如果try/catch被省略,代碼將不能成功編譯。這個例子是捕捉由解析方法而不是純異常或拋出的Throwable具體DateTimeParseException,所以本實施例中示出了簡潔和正確的代碼。 –

+0

@JasonPlurad嗯,'DateTimeParseException'是'RuntimeException'所以編譯器不需要明確的異常處理(拋出或捕獲)。或者你談論別的什麼?無論如何,'LocalDate.parse(...)'會在沒有try/catch代碼的情況下編譯。但是,如果這個解決方案是優雅的話,那麼另一個問題是。 –

0

閱讀了有關PatternMatcher,並正則表達式

Java代碼(基於OP):

if (date.matches("\\d{2}-\\d{2}-\\d{4}")){ 
    //convert D format to Y format... 
} else if(date.matches("\\d{4}-\\d{2}-\\d{2}")){ 
    //convert Y to D... 
} else { 
    throw new IllegalArgumentException("Received date format is not recognized."); 
} 

注:本場比賽,圖案可與capture groups得到改善。
例如:"\\d{4}(-\\d{2}){2}""(-?\\d{2}){2}\\d{4}"

+2

Downvoter是歡迎說明理由 – XenoRo

7

有2個選項:

  1. 嘗試檢查與正則表達式做某事。像:

    if (dateString.matches("\\d{4}-\\d{2}-\\d{2}")) { 
        ... 
    } 
    
  2. 嘗試轉換到第一圖案,如果拋出異常,試圖轉換爲另一種模式(但它是不好的做法,這樣做)

+0

我會嘗試的第一個選項我已經嘗試了第二個選項,但它轉換,給了不合適date.Thank你 – Sreemat

+0

使用異常應該限於實際的例外情況,而不是處理預期的行爲。 -1。 – XenoRo

+0

它不會拋出異常@AlmightyR – Sreemat

-2

只是比較的位置日期字符串中的第一個' - '字符。

+1

假定讀者知道或瞭解「如何做」,在這一點上,他們很可能不會問/閱讀這個答案。 -1。 – XenoRo

+0

您的歡迎和感謝全能的 –

+0

@SantoshVishwakarma現在,這個答案應該已發佈爲評論。請添加更多解釋和示例代碼,以成爲一個完整的答案。 –

0

參見:https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/datetime/iso/examples/StringConverter.java

非ISO日期轉換 https://docs.oracle.com/javase/tutorial/datetime/iso/nonIso.html

添加標識ISO日期兩種方式是相互兼容(防斷裂)的新年表裝置輸入的日期數據和存儲它在正確的結構中(其他函數可以輕鬆地對數據進行操作)。參見:https://docs.oracle.com/javase/8/docs/api/java/time/chrono/Chronology.html

'正則表達式方法'可以被錯誤的輸入打破,並且不會返回任何輸入的標準錯誤(以獲得標準的相同結果)。

查看由用戶提供的答案「Tardate」在這個主題:How to sanity check a date in java

您想要防彈輸入並將其存儲在正確識別的結構中,以便用其他功能輕鬆操作。