1

这是场景。用户输入 3 种类型的输入:

  1. 1/1/2013 12:00:00 AM_5/31/2013 12:00:00 AM
  2. 1/1/2013 12:00:00 AM_
  3. _5/31/2013 12:00:00 AM

输入用于日期范围查询。

第一个输入:由 _ 分隔符拆分:分为开始日期和结束日期。

第二个输入:由_分隔符分割:输入只是开始日期。

第三个输入:由_分隔符分割:输入只是结束日期。

输入由通用返回类型检索。

if (StringUtils.endsWithIgnoreCase(searchKey, "date")) {
    String dates[] = searchValue.split("_",-1);

    if (dates [0] == null)
    {
        long epoch = System.currentTimeMillis()/1000;
        String format = "MM/dd/yyyy HH:mm:ss aaa";
        dates[0] = new     
        java.text.SimpleDateFormat(format).format(new java.util.Date (epoch*1000));
    }
    else if (dates [1] == null)
    {
        Date dNow = new Date( );
        dates[1] = DateFormat.getInstance().format(dNow);
    }

    String start = dates[0];
    String end = dates[1];
    String format = AppConstant.DATE_FORMAT;
    filters.add(String.format("%s between to_date('%s', '%s') and to_date('%s', '%s')", columnKey, start, format, end, format));
} 

如您所见,整个想法是:

  1. 如果用户没有输入开始日期,则使用纪元日期作为开始日期。
  2. 如果用户没有输入最后日期,则以当前日期n时间作为结束日期。

但不幸的是,这种编码不起作用。我猜问题是 Split 不存储 NULL 值,因此 if 语句不起作用。

我对 java 还是比较陌生,非常感谢任何帮助。

4

3 回答 3

1

dates不会有空条目,它将有空字符串条目。

System.out.println("_foo".split("_", -1)[0].equals(""));//true

String.equals因此,使用该方法测试空字符串

if ("".equals(dates[0]) { ...
于 2013-06-16T18:13:57.420 回答
0

如果您必须以这种方式接收用户输入(使用您描述的三种可能的模式),那么我建议使用正则表达式(regex)来匹配模式的各个部分。

例如:

String user_supplied_date_range_string =
        "1/1/2013 12:00:00 AM_5/31/2013 12:00:00 AM";
Pattern date_range_pattern = Pattern.compile(
        "^([0-9]{1,2}/[0-9]{1,2}/[0-9]{4} "
        + "[0-9]{1,2}:[0-9]{2}:[0-9]{2} (?:A|P)M)?_"
        + "([0-9]{1,2}/[0-9]{1,2}/[0-9]{4} "
        + "[0-9]{1,2}:[0-9]{2}:[0-9]{2} (?:A|P)M)?$");
Matcher matcher = date_range_pattern.matcher(
        user_supplied_date_range_string);

这将创建一个适合您描述的三种模式的正则表达式模式,然后运行正则表达式匹配器来处理用户提供的日期范围字符串,以查看用户的输入是否适合。

现在您可以检查结果以查看模式的第一部分和/或第二部分是否匹配:

if (matcher.matches()) {
    if (matcher.group(1) != null) {
        System.out.println("Start date found: " + matcher.group(1));
    }
    if (matcher.group(2) != null) {
        System.out.println("End date found: " + matcher.group(2));
    }
} else {
    System.out.println("User input does not match date range pattern.");
}

如果第一组和第二组都为空,则用户输入根本不符合模式。

有关更多详细信息,请参阅java.util.regex 包文档

于 2013-06-16T18:04:46.420 回答
0

坦率地说,我认为有一种更简单的方法可以解决这个问题:

1. if searchValue ends with '_'
   then end date = now, parse substring from 0 to length - 1 into date
2. if searchValue starts with '_'
   then start date = epoch, parse substring from 1 to length into date
3. else, split on '_',
   then require two pieces returned by split, parse into dates

我会把它留给你翻译成Java。

于 2013-06-16T18:00:57.930 回答