簡體   English   中英

以這種格式從字符串解析日期:dd / MM / yyyy [to dd / MM / yyyy]

[英]Parse Date from String in this format : dd/MM/yyyy [to dd/MM/yyyy]

我想在Java中用這種格式解析String的最佳方法是dd / MM / yyyy [到dd / MM / yyyy]。 帶[]的字符串是可選的,dd代表日期的2位數表示,MM是月份的2位數表示,yyyy是年份的4位數表示。


更新

謝謝大家的快速響應,但是我忘了告訴你[]是象征可選的,字符串中沒有[]示例字符串可能是

  • 22/01/2010
  • 2010年1月22日至23/01/2010
  • 空值

目前我用這種方式編寫代碼,工作但很難看=(

String _daterange = (String) request.getParameter("daterange");
    Date startDate = null, endDate = null;
    // Format of incoming dateRange is 
    if (InputValidator.requiredValidator(_daterange)) {
        String[] _dateRanges = _daterange.toUpperCase().split("TO");
        try {
            startDate = (_dateRanges.length > 0) ? sdf.parse(_dateRanges[0]) : null;
            try{
                endDate = (_dateRanges.length > 1) ? sdf.parse(_dateRanges[1]) : null;
            }catch(Exception e){
                endDate = null;
            }
        } catch (Exception e) {
            startDate = null;
        }
    }

使用java.text.DateFormatjava.text.SimpleDateFormat來完成它。

DateFormat sourceFormat = new SimpleDateFormat("dd/MM/yyyy");
String dateAsString = "25/12/2010";
Date date = sourceFormat.parse(dateAsString);

更新:

如果您有兩個日期隱藏在該字符串中,則必須將它們分成兩部分。 我認為其他人已經指出了“分裂”的想法。 我只是在空白處打破並扔掉“TO”。

不要擔心效率。 你的應用程序很可能充滿了比這更糟糕的低效率。 只有當分析告訴你這個片段是最糟糕的罪犯時,才能使它正常工作並重構它。

TL;博士

LocalDate.parse( 
    "22/01/2010" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

…更多…

// String input is:
// (a) long: "22/01/2010 to 23/01/2010". 
// (b) short: "22/01/2010".
// (c) null.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;

if( input.length() == 24 ) {           // Ex: "22/01/2010 to 23/01/2010"
    List<LocalDate> lds = new ArrayList<>( 2 );
    String[] inputs = input.split( " to " );
    for( String nthInput : inputs ) {
        LocalDate ld = LocalDate.parse( nthInput , f ) ;
        lds.add( ld );
    }
    … // Do what you want with `LocalDate` objects collection.

} else if( input.length() == 10 ) {    // Ex: "22/01/2010"
    LocalDate ld = LocalDate.parse( input , f ) ;
    … // Do what you want with `LocalDate` object.

} else if( null == input ) {
    … // Decide what you want to do for null input.

} else {
    System.out.println( "Unexpected input: " + input ) ;
}

請參閱IdeOne.com上的代碼

使用java.time

其他Answers使用麻煩的舊日期時間類,這些類現在是遺留的,由java.time類取代。

至於處理多種類型的字符串,請查看字符串的長度。

if( input.length() == 10 ) { … }

如果長,則拆分4個字符的子串“to”。

String[] inputs = "22/01/2010 to 23/01/2010".split( " to " );

將日期字符串解析為LocalDate

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "22/01/2010" , f );

關於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 input = "02/08/2010 [to 31/12/2010]";
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date d  = format.parse(input.split(" ")[0]);
System.out.println(d) ;

你可以這樣做 -

String input = "02/08/2010 [to 31/12/2010]";
    java.text.DateFormat format = new java.text.SimpleDateFormat("dd/MM/yyyy");
    java.util.Date d = null;
    try {
        d = format.parse(input.split(" ")[0]);
    } catch (java.text.ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(d) ;

如果帶有[]的字符串不存在,則input.split(" ")[0]將僅返回第一個字符串。

暫無
暫無

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

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