java中compareTo比较两个日期大小

java中compareTo比较两个日期大小

我们对两个日期进行比较的时候,或者是日期的string进行比较的时候,以前我一直以为,如果大于的话compareTo的返回值应该是1,等于的话是0,小于的话是-1,网上很多也是这样说,但是现实中我程序出错,最后打出来,看了一下,如果大于的话返回的是正整数,等于是0,小于的话就是负整数,而不仅仅局限于1,0和-1,以后做比较要注意(这段话出处见此)

日期进行比较

源码

    /**
     * Compares two Dates for ordering.
     *
     * @param   anotherDate   the Date to be compared.
     * @return  the value 0 if the argument Date is equal to
     *          this Date; a value less than 0 if this Date
     *          is before the Date argument; and a value greater than
     *      0 if this Date is after the Date argument.
     * @since   1.2
     * @exception NullPointerException if anotherDate is null.
     */
    public int compareTo(Date anotherDate) {
        long thisTime = getMillisOf(this);
        long anotherTime = getMillisOf(anotherDate);
        return (thisTime1 : (thisTime==anotherTime ? 0 : 1));
    }

例子

package bai.test;

import java.util.Calendar;
import java.util.Date;

import org.junit.Test;

public class CompareTo_Date {

    @Test
    public void test() {
        Calendar c = Calendar.getInstance();

        c.set(2016,5,4);
        Date before =c.getTime();

        c.set(2016,5,5);
        Date now=c.getTime();

        c.set(2016,5,6);
        Date after=c.getTime();

        //before早于now,返回负数,可用于判断活动开始时间是否到了
        int compareToBefore=before.compareTo(now);
        System.out.println("compareToBefore = "+compareToBefore);

        int compareToIntNow=now.compareTo(now);
        System.out.println("compareToIntNow = "+compareToIntNow);

        //after晚于now,返回正数,可用于判断活动结束时间是否到了
        int compareToIntAfter=after.compareTo(now);
        System.out.println("compareToIntAfter = "+compareToIntAfter);
    }

}

输出如下

compareToBefore = -1
compareToIntNow = 0
compareToIntAfter = 1

日期的string进行比较

源码

    /**
     * Compares two strings lexicographically.
     * The comparison is based on the Unicode value of each character in
     * the strings. The character sequence represented by this
     * String object is compared lexicographically to the
     * character sequence represented by the argument string. The result is
     * a negative integer if this String object
     * lexicographically precedes the argument string. The result is a
     * positive integer if this String object lexicographically
     * follows the argument string. The result is zero if the strings
     * are equal; compareTo returns 0 exactly when
     * the {@link #equals(Object)} method would return true.
     * 

* This is the definition of lexicographic ordering. If two strings are * different, then either they have different characters at some index * that is a valid index for both strings, or their lengths are different, * or both. If they have different characters at one or more index * positions, let k be the smallest such index; then the string * whose character at position k has the smaller value, as * determined by using the < operator, lexicographically precedes the * other string. In this case, compareTo returns the * difference of the two character values at position k in * the two string -- that is, the value: *

     * this.charAt(k)-anotherString.charAt(k)
     * 
* If there is no index position at which they differ, then the shorter * string lexicographically precedes the longer string. In this case, * compareTo returns the difference of the lengths of the * strings -- that is, the value: *
     * this.length()-anotherString.length()
     * 
* * @param anotherString the String to be compared. * @return the value 0 if the argument string is equal to * this string; a value less than 0 if this string * is lexicographically less than the string argument; and a * value greater than 0 if this string is * lexicographically greater than the string argument. */ public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }

例子

    @Test
    public void test() {
        String date = "2017-07-17 11:03:52";
        System.out.println("compareToBefore1 : "+date.compareTo("2017-06-16 11:03:52"));
        System.out.println("compareToBefore2 : "+date.compareTo("2017-05-16 11:03:52"));
        System.out.println("compareToNow1 : "+date.compareTo("2017-07-17 11:03:52"));
        System.out.println("compareToNow2 : "+date.compareTo("2017-07-17"));
        System.out.println("compareToAfter1 : "+date.compareTo("2017-07-18 11:03:52"));
        System.out.println("compareToAfter2 : "+date.compareTo("2017-09-16 11:03:52"));
    }

输出如下

compareToBefore1 : 1
compareToBefore2 : 2
compareToNow1 : 0
compareToNow2 : 9
compareToAfter1 : -1
compareToAfter2 : -2

你可能感兴趣的:(java基础,java)