为什么字符串比较结果不是在Java中打印0,1或-1?

时间:2016-01-06 18:03:44

标签: java date

我必须比较一个日期并检查它是否在一个范围内。我已经输入了两个日期作为输入,其中一个是开始日期,另一个是结束日期。比较日期不应早于开始日期之前或结束日期之后。

我把所有这些都作为字符串并将它们全部分开。

当我将日期与开始日期进行比较时,可以。但是当与完成日期的月份进行比较时,它显示6的结果。它应显示1, 0, or -1的结果,因为我正在比较字符串。

以下是来源,我已经在我遇到问题的行上面做了评论。还给出了示例输入和输出。我在哪里弄错了?

System.out.println("................");

//store the value of start date limit.
String[] startDate  =   start_jTextField1.getText().split("-");

//store the value of start date limit.
String[] finishDate =   finish_jTextField2.getText().split("-");

//store the date that have to check.
String[] check_this_date = Check_this_Date_jTextField1.getText().split("-");

System.out.println("start:");
for(String start : startDate )
{
    System.out.println(start);
}

System.out.println("Finish:");
for(String finish : finishDate )
{
    System.out.println(finish);
}

System.out.println("Check:");
for(String checkDate : check_this_date )
{
    System.out.println(checkDate);
}


boolean start_range_check   = false;
boolean finish_range_check  = false;

//My question is about the next line and why it is printing 6.
//It should print 0, 1, or -1.
System.out.println("Before Finish check block(month):\n"+ check_this_date[1].compareTo( finishDate[1] ) );

System.out.println("Before Finish check block(day compare):\n"+ check_this_date[0].compareTo( finishDate[0] ) );//here date will be compared with finish date's date.

if( check_this_date[2].compareTo(startDate[2]) == 1 ||  check_this_date[2].compareTo(startDate[2]) == 0)//if year greater or equal to from start range year.
{
    System.out.println("starZone:"+start_range_check);//print the current start_range_check  value to ensure that above condition has satisfied.
    if(check_this_date[1].compareTo(startDate[1]) == 1 ||  check_this_date[1].compareTo(startDate[1]) == 0)//if month greater or equal to from start range month.
    {
        System.out.println("starZone:"+start_range_check);//print the current start_range_check  value to ensure that above condition has satisfied.
        if(check_this_date[0].compareTo(startDate[0]) == 1 ||  check_this_date[0].compareTo(startDate[0]) == 0)//if day greater or equal to from start range day.
        {
            start_range_check = true;
            System.out.println("starZone:"+start_range_check);//print the current start_range_check  value to ensure that above condition has satisfied and start_range_check changed.
        }
    }
}

if(check_this_date[2].compareTo( finishDate[2] ) == -1 || check_this_date[2].compareTo( finishDate[2] ) == 0 )
{
    System.out.println("finishZone result(year):\n"+check_this_date[2].compareTo( finishDate[2]) );//print the comparision result.

    System.out.println("finishZone(before month checking):\n"+check_this_date[1].compareTo( finishDate[1]) );//print the comparision result.my question why the result is 6 here.

    if(check_this_date[1].compareTo( finishDate[1] ) == -1 || check_this_date[1].compareTo( finishDate[1] ) == 0 )
    {
        System.out.println("finishZone"+start_range_check);
        if(check_this_date[0].compareTo( finishDate[0] ) == -1 || check_this_date[0].compareTo( finishDate[0] ) == 0 )
        {
            finish_range_check = true;
            System.out.println("finishZone"+start_range_check);//print the current start_range_check  value to ensure that above condition has satisfied and start_range_check changed.
        }
    }
}

if( finish_range_check == true && start_range_check == true )
{
    result_jLabel2.setText("Within Range.");
}
else
{
    result_jLabel2.setText("Not in Range");
}


Sample input and output:
Date Format: dd-MM-yyyy
................
start:
28
6
2015
Finish:
28
12
2015
Check:
28
7
2015
Before Finish check block(month comparing):
6
Before Finish check block(day comparing):
0
starZone:false
starZone:false
starZone:true
finishZone result(year):
0
finishZone(before month checking):
6

3 个答案:

答案 0 :(得分:4)

阅读compareTo()的javadoc:

  

返回负整数正整数,因为此对象小于,等于或大于指定的对象对象

它没有指定负数或正数的实际值,因此您不能指望它是-11

使用compareTo()时,您应始终将结果检查为< 0<= 0== 0>= 0> 0或{{1根据您的需要 基本上!= 0date1.compareTo(date2) <= 0的Java代语。

答案 1 :(得分:1)

Andreas's answer不太完整。

虽然这是事实,但并不能解释为什么会这样。

The derivation still comes from the javadocs

  

这是词典排序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,这两个字符串是两个字符串的有效索引,或者它们的长度不同,或两者都有。如果它们在一个或多个索引位置具有不同的字符,则令k为最小的索引;然后,通过使用&lt;来确定位置k处的字符具有较小值的字符串。运算符,按字典顺序排在另一个字符串之前。在这种情况下,compareTo返回两个字符串中位置k处两个字符值的差值 - 即值:

     

this.charAt(k)-anotherString.charAt(k)

换句话说,返回的值是前两个(相同索引)字符不匹配的字典差异。这就是您可能无法收到-11的原因。

javadoc继续:

  

如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。在这种情况下,compareTo返回字符串长度的差异 - 即值:

     

this.length()-anotherString.length()

这是返回不同数字的另一个原因。

这就是必须使用不等式进行比较以确定哪个字符串按字典顺序大于或小于另一个字符串的原因。

答案 2 :(得分:1)

正如@Andreas告诉你为什么要将结果与0比较,而不是1或-1。 @Nick Miller提供了更多的理论细节。

我同意@Makoto和@Dariusz Sendkowski认为它在你尝试的方式上很复杂。

以下是您的问题的示例解决方案。更多细节和示例在以下链接中。还有其他一些方法可以做到这一点。

  SimpleDateFormat setDateFormat = new SimpleDateFormat ("dd-MM-yyyy");

        try
          {
            Date startDate  = setDateFormat.parse( start_jTextField1.getText()  );
            Date finishDate = setDateFormat.parse( finish_jTextField2.getText() );
            Date check_this_date = setDateFormat.parse( Check_this_Date_jTextField1.getText() );

              System.out.println("Start Date:"+ setDateFormat.format(startDate));
              System.out.println("Finish Date:"+ setDateFormat.format(finishDate));

            if( check_this_date.before(finishDate) && check_this_date.after(startDate))
              {
                  result_jLabel2.setText("Within Range.");
              }
            else if(check_this_date.equals(finishDate) || check_this_date.equals(startDate))
              {
                result_jLabel2.setText("Within Range.");
              }
            else
              {
                 result_jLabel2.setText("Not in rannge.");
              }
          }
        catch(Exception ex)
          {
            ex.printStackTrace();
          }

More examples are here...