代码之家  ›  专栏  ›  技术社区  ›  Joel

识别任意日期字符串

  •  22
  • Joel  · 技术社区  · 14 年前

    我需要能够识别日期字符串。如果我不能区分月份和日期(例如12/12/10),那就不重要了,我只需要将字符串分类为日期,而不是将其转换为日期对象。所以,这实际上是一个分类,而不是解析问题。

    我会有一些文本,比如:

    “废话废话废话 12月09日 BLA BLA BLA 01/04/10 BLA BLA BLA

    我需要能够识别其中每个日期字符串的开始和结束边界。

    我想知道有没有人知道任何Java库能做到这一点。到目前为止,我的google fu还没有找到任何东西。

    更新:我需要能够识别最广泛的一组表示日期的方法。当然,幼稚的解决方案可能是为每种可能的格式编写一个if语句,但是 模式识别方法 有了一个训练有素的模特,理想情况下就是我想要的。

    14 回复  |  直到 14 年前
        1
  •  5
  •   nico.ruti nakib    12 年前
        2
  •  5
  •   Bozho    14 年前

    for (Locale locale : DateFormat.getAvailableLocales()) {
        for (int style =  DateFormat.FULL; style <= DateFormat.SHORT; style ++) {
            DateFormat df = DateFormat.getDateInstance(style, locale);
            try {
                    df.parse(dateString);
                    // either return "true", or return the Date obtained Date object
            } catch (ParseException ex) {
                continue; // unperasable, try the next one
            }
        }
    }
    

        3
  •  5
  •   darioo    14 年前

    1. Jan January
    2. ordinal numbers
    3. 0*
    4. {-,_, ,:,/,\,.,','}

    ListOfPossibleDates Date

    "bla bla bla bla 12 Jan 09 bla bla bla 01/04/10 bla bla bla" 12 Jan 09 "bla bla bla 01/04/10 bla bla bla"

        4
  •  4
  •   Martijn Courteaux    14 年前

    public static final String DATE_REGEX = "\b([0-9]{1,2} ?([\\-/\\\\] ?[0-9]{1,2} ?| (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?)([\\-/\\\\]? ?('?[0-9]{2}|[0-9]{4}))?)\b";
    public static final Pattern DATE_PATTERN = Pattern.compile(DATE_REGEX, Pattern.CASE_INSENSITIVE); // Case insensitive is to match also "mar" and not only "Mar" for March
    
    public static boolean containsDate(String str)
    {
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }
    

    06 Sep 2010
    12-5-2005
    07 Mar 95
    30 DEC '99
    11\9\2001
    

    444/11/11
    bla11/11/11
    11/11/11blah
    

    [] () ,

    Yesterday (6 nov 2010)
    

    Yesterday, 6 nov, was a rainy day...
    

    86-44/1234
    00-00-0000
    11\11/11
    

        5
  •  4
  •   Matt    11 年前
        6
  •  2
  •   carlosdc    14 年前
        7
  •  2
  •   MD. Mohiuddin Ahmed    11 年前

    import com.joestelmach.natty.*;
    
    List<Date> dates =new Parser().parse("Start date 11/30/2013 , end date Friday, Sept. 7, 2013").get(0).getDates();
            System.out.println(dates.get(0));
            System.out.println(dates.get(1));
    
    //output:
            //Sat Nov 30 11:14:30 BDT 2013
            //Sat Sep 07 11:14:30 BDT 2013
    
        8
  •  1
  •   zserge    14 年前

    ^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$

    (0[1-9]|1[012]) (0[1-9]|[12][0-9]|3[01]) (19|20)\d\d

        9
  •  1
  •   Paweł Dyda    14 年前
        10
  •  1
  •   David Watson    14 年前

        11
  •  0
  •   npinti    14 年前

        12
  •  0
  •   Glenn Nelson    14 年前

    12/12/12

        13
  •  0
  •   prototypef    14 年前

        14
  •  0
  •   Salem    14 年前

    public static boolean isDate(){
         String date = "12/25/2010";
         int counter = 0;
         for(int i=0; i<date.length(); i++){
              if ("\/-.".indexOf(date.charAt(i)) != -1) //Any symbol can be used. 
                   counter++;
         }
         if(counter == 2)    //If there are two symbols in the string,
              return true;   //Return true.
         else
              return false;
    }