如何计算程序中的年份差异?

时间:2019-12-12 10:59:00

标签: java date methods

我正在编写一个程序,用户可以在其中输入日期并打印出来。该程序还有一个给定的日期,可以通过第二次输入来计算年差。我当前的问题是,当我调用计算方法时,一切似乎都可以正常工作,但是不幸的是输出始终为0。

这是我的代码:

import java.util.Scanner;
public class Dates{
    static Scanner scan = new Scanner(System.in);
    // Attributes
    static int Day;
    static int Month;
    static int Year;

    //Constructor
    Dates(int x, int y, int z){
        Day = 12;
        Month = 12;
        Year = 2019;
        if(Day > 31) {
            do {
                System.out.println("Wrong day! repeat entry: ");
                Day = scan.nextInt();
            }while (Day > 31);
        }
        if(Month > 12) {
            do {
                System.out.println("Wrong month! repeat entry: ");
                Month = scan.nextInt();
            }while(Month > 12); 
        }
        if(Year < 1800) {
            do {
                System.out.println("Incorrect Year! repeat entry: ");
                Year = scan.nextInt();
            }while(Year < 1800);
        }
    }
//Calculates Year difference
public static int getYeardiff(int day, int month, int year) {
    System.out.println("Press <0>, if you want to know passed years between two dates. ");
    int difference = 0;
    int key = scan.nextInt();
    if(key == 0) {
        System.out.println("Enter a second date: ");
        Dates diffr = new Dates(Day, Month, Year);
        diffr.Day = scan.nextInt();
        diffr.Month = scan.nextInt();
        diffr.Year = scan. nextInt();
        if(diffr.Year <= Dates.Year) {
            difference = Dates.Year - diffr.Year;
            System.out.println(difference);
        }
    }
    return difference;
}
//Formats the date into a String.
public static String asString(int day, int month, int year) {
    String stringDay = "" + Day;
    String stringMonth = "" + Month;
    String stringYear = "" + Year;
    String stringDate = stringDay + "." + stringMonth+ "." + stringYear;
    System.out.println(stringDate);
    return stringDate;
}


public static void main(String[] args) {
    System.out.println("Enter todays date!");
    Dates xmas = new Dates(Day, Month ,Year);
    xmas.Day = scan.nextInt();
    xmas.Month = scan.nextInt();
    xmas.Year = scan.nextInt();
    asString(xmas.Day, xmas.Month, xmas.Year);
    getYeardiff(Day, Month, Year);
    }
}

这是更好概述的方法。

public static int getYeardiff(int day, int month, int year) {
   System.out.println("Press <0>, if you want to know passed years between two dates. ");
   int difference = 0;
   int key = scan.nextInt();
   if(key == 0) {
       System.out.println("Enter a second date: ");
       Dates diffr = new Dates(Day, Month, Year);
       diffr.Day = scan.nextInt();
       diffr.Month = scan.nextInt();
       diffr.Year = scan. nextInt();
       if(diffr.Year <= Dates.Year) {
           difference = Dates.Year - diffr.Year;
           System.out.println(difference);
       }
   }
   return difference;
}

可以说,我得到的输出始终为0。 这是完整的输出:

Enter todays date!
12
12
2019
12.12.2019
Press <0>, if you want to know passed years between two dates. 
0
Enter a second date: 
12
12
1990
0

我的问题是,为了从我的计算方法中获得正确的输出,我必须更改什么?

3 个答案:

答案 0 :(得分:2)

使用大写字母的字段违反Java标准。同样,您的Dates类的构造函数对传入的参数也不做任何事情。而是从扫描仪分配它们。这也违反惯例。扫描仪应该在外面要求输入,然后您根据用户输入的内容构造类。

我修改了您的代码,如下所示:

首先,您的Dates类可以简化为:

int day;
int month;
int year;

//Constructor
Dates(int day, int month, int year) {
  this.day = day;
  this.month = month;
  this.year = year;
}

然后我创建了一种要求输入日期的方法

public static Dates getDates() {
  int day = 0, month = 0, year = 0;

  System.out.print("Enter the day: ");
  day = scan.nextInt();

  while (day > 31 || day < 1) {
    System.out.println("Wrong day! repeat entry: ");
    day = scan.nextInt();
  }

  System.out.print("Enter the month: ");
  month = scan.nextInt();

  while(month > 12 || month < 1) {
    System.out.println("Wrong month! repeat entry: ");
    month = scan.nextInt();
  }

  System.out.print("Enter the year: ");
  year = scan.nextInt();
  while(year > 9999 || year < 1800 ) {
    System.out.println("Incorrect Year! repeat entry: ");
    year = scan.nextInt();
  }

  return new Dates(day, month, year);
}

然后简化您的getYeardiffasString函数:

//Calculates Year difference
public static int getYeardiff(Dates other) {
  Scanner scanner = new Scanner(System.in);
  System.out.print("Press <0>, if you want to know passed years between two dates. ");
  int difference = 0;
  int key = scan.nextInt();
  if(key == 0) {
    System.out.println("Enter a second date: ");

    Dates diffr = getDates();

    difference = Math.abs(diffr.year - other.year);
    System.out.println(difference);
  }
  return difference;
}

//Formats the date into a String.
public static String asString(Dates other) {
  String stringDay = "" + other.day;
  String stringMonth = "" +other.month;
  String stringYear = "" + other.year;
  String stringDate = stringDay + "." + stringMonth+ "." + stringYear;
  System.out.println(stringDate);
  return stringDate;
}

最后是您的main方法:

public static void main(String[] args) {
  System.out.println("Enter todays date!");
  Dates xmas = getDates();
  asString(xmas);
  getYeardiff(xmas);
  scan.close();
}

答案 1 :(得分:1)

我认为问题在于整个代码结构,您正在使用静态变量,然后将它们视为实例变量,请尝试重新设计您的类,以正确地将DAY,MONTH,YEAR变量定义为普通变量,而不是static coz static应该仅在您希望在类级别而不是对象级别上使用某个固定值时使用,甚至您也可以将Dates类与主类分开以使事情更轻松,更清晰。

答案 2 :(得分:0)

diffr.YearDates.Year指向相同的值。

xmas对象传递到getYeardiff并执行difference = Dates.Year - xmas.Year;

例如 可以将getYeardiff调整为


    public static int getYeardiff(Dates today) {
        System.out.println("Press <0>, if you want to know passed years between two dates. ");
        int difference = 0;
        int key = scan.nextInt();
        if(key == 0) {
            System.out.println("Enter a second date: ");
            Dates diffr = new Dates(Day, Month, Year);
            diffr.Day = scan.nextInt();
            diffr.Month = scan.nextInt();
            diffr.Year = scan. nextInt();
            if(diffr.Year <= Dates.Year) {
                difference = differ.Year - today.Year;
                System.out.println(difference);
            }
        }
        return difference;
    }

主要方法可以调整为

    public static void main(String[] args) {
        System.out.println("Enter todays date!");
        Dates xmas = new Dates(Day, Month ,Year);
        xmas.Day = scan.nextInt();
        xmas.Month = scan.nextInt();
        xmas.Year = scan.nextInt();
        asString(xmas.Day, xmas.Month, xmas.Year);
        getYeardiff(xmas);
    }
相关问题