这是场景。 用户输入3种输入:
1/1/2013 12:00:00 AM_5/31/2013 12:00:00 AM
1/1/2013 12:00:00 AM_
_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));
}
正如您所看到的,整个想法是:
但不幸的是,这种编码不起作用。我猜测问题是Split不存储NULL值,因此if语句不起作用。
我还是比较新的java,非常感谢任何帮助。
答案 0 :(得分:1)
dates
将没有空条目,它将具有空字符串条目。
System.out.println("_foo".split("_", -1)[0].equals(""));//true
因此,使用String.equals
方法
if ("".equals(dates[0]) { ...
答案 1 :(得分: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。
答案 2 :(得分:0)
如果您必须以这种方式接收用户输入(使用您描述的三种可能模式),那么我建议使用正则表达式(正则表达式)来匹配模式的各个部分。
例如:
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 package docs。