关于java日期比较的困惑

时间:2014-02-08 15:10:23

标签: java compareto

预调:

  1. 是的,这是作业。
  2. 我们学校的导师出去了
  3. 我的书没用了
  4. 我不确定在google上寻找什么可以帮助解决我的困惑......
  5. 问题:

    无论如何 - 我遇到的问题/混淆涉及我在程序中测试compareTo方法的第一段代码。

    1. 我会将代码顶部的变量用作static void main区域中的变量,还是像我一样分配新变量?

    2. public Date()中的值...< - 这是static void main中的代码与之比较的日期吗? (如果是这样,我有一段我想要使用的代码,它使用的是当前日期,而不是Date()中的代码)。

    3. 我以后可能会有更多问题,但我希望有人可以比我的书更好地解决我的困惑,或者google已经证明了这一点。

      代码:

      package date;
      import java.util.*;
      
      public class Date implements Comparable
      {
           static Scanner console = new Scanner(System.in);
      
           private int dMonth;  //Part a of confusion 1
           private int dDay;
           private int dYear;
      
          public Date()
          {
              dMonth = 1;  //Confusion 2
              dDay = 1;
              dYear = 1900;
          }
          public Date(int month, int day, int year)
          {
              dMonth = month;
              dDay = day;
              dYear = year;
          }
          public void setDate(int month, int day, int year)
          {
              dMonth = month;
              dDay = day;
              dYear = year;
          }
          public int getMonth()
          {
              return dMonth;
          }
          public int getDay()
          {
              return dDay;
          }
          public int getYear()
          {
              return dYear;
          }
          public String toString()
          {
              return (dMonth + "." + dDay + "." + dYear);
          }
          public boolean equals(Object otherDate)
          {
              Date temp = (Date) otherDate;
      
              return (dYear == temp.dYear
                      && dMonth == temp.dMonth
                      && dDay == temp.dDay);
          }
          public int compareTo(Object otherDate)
          {
              Date temp = (Date) otherDate;
      
              int yrDiff = dYear - temp.dYear;
              if (yrDiff !=0)
                  return yrDiff;
      
              int monthDiff = dMonth - temp.dMonth;
              if (monthDiff !=0)
                  return monthDiff;
      
              return dDay - temp.dDay;           
          }
      
          public static void main(String[] args)  //Part b of confusion 1
          {
              int month;
              int day;
              int year;
      
              Date temp;
      
              System.out.print("Enter date in the form of month day year");
              month = console.nextInt();
              day = console.nextInt();
              year = console.nextInt();
              System.out.println();
      
          }
      }
      

2 个答案:

答案 0 :(得分:3)

正如评论中所提到的,我认为您需要了解静态方法/属性与实例中的静态方法/属性之间的区别。我认为这是你应该在main方法中做的事情:

System.out.print("Enter date in the form of month day year");
Date date1 = new Date(console.nextInt(), console.nextInt(), console.nextInt());

System.out.print("Enter second date in the form of month day year");
Date date2 = new Date(console.nextInt(), console.nextInt(), console.nextInt());

System.out.println("Comparison result:");
System.out.println(date1.compareTo(date2));

关于你的困惑点:

类属性

 private int dMonth;  //Part a of confusion 1
 private int dDay;
 private int dYear;

这些是特殊变量。每个实例(即使用new Date创建的每个对象)都有dMonthdDaydYear的值。它不能从main访问,因为main是一个静态方法,因此无法访问实例变量。

如果你不明白,至少你知道要进一步搜索的名字。

默认构造函数

public Date()
{
    dMonth = 1;  //Confusion 2
    dDay = 1;
    dYear = 1900;
}

当您创建新的Date对象而未指定所需的月/日/年时,将使用这些值。因此new Date(2, 3, 2013)表示2/3/2013,而new Date()表示1/1/1900。

答案 1 :(得分:2)

  1. 不,你不能,dMonthdDaydYearmember variables。如果您想在main方法中直接使用它们,则必须使用关键字static,以便它们变为class variables。但不,那不是你想要的。
  2. 你的主要方法真的没用。你的困惑点2是一个构造函数:

    Date d = new Date(); // Data Instance -> First constructor
    d.getMonth(); // 1
    d.getDay(); // 1
    d.getYear(); // 1900
    
    Date d2 = new Date(2, 2, 1901); 
    d2.getMonth(); // 2
    d2.getDay(); // 2
    d2.getYear(); // 1901
    
    d2.setDate(3, 3, 1902);
    d2.getMonth(); // 3
    d2.getDay(); // 3
    d2.getYear(); // 1902 
    
    d.getMonth(); // Still 1 since member variables of d are independent of d2
    
    d.compareTo(d2); // -2 -> (1900 - 1902)
    

    您可以在main方法中创建日期实例,并使用上面的代码来访问成员变量(可能是练习的全部内容)。