这是我的问题-我需要解析一个字符串并查找它是否包含日期。字符串示例:

“明天凌晨2点”
“ 2010年2月16日16:00”
“今天16:00”

您是否知道可解决人类可读日期转换的任何Java库?

最佳答案

这是两个问题,一个关于识别,另一个在转换。

识别可能的日期上下文是(相对)容易的,但是由于多种原因,转换非常成问题,尤其是人们可以用多种方式语义表达日期的方式,以及随之而来的歧义和错误陈述。让我们在这里看一些明显的陷阱:


“后天下午2点。”如果我们只是简单地在“明天下午2点”进行评估,那将是一天的漂泊。
“ 2010年10月16日之后两天”。情况变得越来越糟...
“ 2013年3月13日,星期五,晚上9点之前不多”,我们可以追溯到日期,但是上下文使它变得非常模棱两可。


假设您只想在字符串中标识潜在的日期匹配,则可以执行以下操作...

private final String[] datePatterns = {"Yesterday","Today","Tomorrow", //etc
        "Sunday","Monday","Tuesday","Thursday","Friday", // etc
         "Lundi","Mardi","Mercredi", //etc in French
        "2001","2002", // all the years
        "AM","PM",
        "January","February","March","August"};
private List lx  = new ArrayList();


public boolean mayContainDates(String toCheck)
{
toCheck = toCheck.toUpperCase();

// irl we'd build this list 1 time in the constructor
for(int i = 0; i < datePatterns.length; i++)
{
lx.add(datePatterns[i].toUpperCase());
}

   Iterator lit = lx.iterator();

    while(lit.hasNext())
    {
    if (toCheck.contains((String) lit.next())
    {
    return true;
    }
    }

    return false;
}


这实际上是关于如何设置比较器的datePattern String数组的问题。或者,您可以以某种相似的方式迭代一组正则表达式,但是速度很慢。您可能会得到很多误报,但显然可以在此简单模型上进行改进。

10-07 19:09
查看更多