Как установить дату в Григорианском календаре

#java

#Ява

Вопрос:

Я хочу установить дату в месяц/день/год в своем классе (григорианский календарь), чтобы она работала с моей программой тестирования. Я получаю ошибки при запуске своей тестовой программы, я думаю, что это связано с моим методом string toString (), но я пытался исправить это, но продолжаю получать ошибки. Я не понимаю, как мой вывод строки в месяц день год не будет корректно работать при выводе мммм/дд/гггг. Спасибо вам за вашу помощь.

Ошибки:

 Exception in thread "main" java.lang.IllegalArgumentException at Date.lt;initgt;(Date.java:15) at Assign8B.main(Assign8B.java:14)  

Класс

 public class Date {  private int day, month, year;  public Date() {  this.day = 1;  this.month = 1;  this.year = 1970;  }  public Date(int year, int month, int day) {  if (year lt; 1582) {  throw new IllegalArgumentException();  } else if (month lt;= 0 amp;amp; month gt; 12) {  throw new IllegalArgumentException();  } else if (!isLeapYear(year) amp;amp; (month == 2 amp;amp; day == 29)) {  throw new IllegalArgumentException();  } else {  this.day = day;  this.month = month;  this.year = year;  }  }  public void addDays(int days) {  int[] daysOfMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int step = 1;    if(days lt; 0)  step = -1;    if(isLeapYear(year))  daysOfMonth[1] = 29;   int d = 0;  while(d lt; days){  d  ;  day  = step;  if(day gt; daysOfMonth[month-1]){  day = 1;  month  ;  if(month gt; 12){  year  ;  month = 1;  if(isLeapYear(year))  daysOfMonth[1] = 29;  else  daysOfMonth[1] = 28;  }  }  else if(day lt; 1) {  month--;  if(month == 0) {  month = 12;  year--;  if(isLeapYear(year))  daysOfMonth[1] = 29;  else  daysOfMonth[1] = 28;  }  day = daysOfMonth[month-1];  }  }  }  public void addWeeks(int weeks) {  addDays(weeks * 7);  }  public int getDay() {  return day;  }  public void setDay(int day) {  this.day = day;  }  public int getMonth() {  return month;  }  public void setMonth(int month) {  this.month = month;  }  public int getYear() {  return year;  }  public void setYear(int year) {  this.year = year;  }  public boolean isLeapYear() {  return isLeapYear(this.year);  }  public boolean isLeapYear(int year) {  return(year % 400 == 0 || (year % 4 == 0 amp;amp; year % 100 != 0));  }  public int daysTo(Date other) {  int days = 0;  int d1, m1, y1, d2, m2, y2;  int sign = 1;    if(this.toString().compareTo(other.toString()) gt; 0){  d1 = other.day;  m1 = other.month;  y1 = other.year;   d2 = day;  m2 = month;  y2 = year;  sign = -1;  } else {  d1 = day;  m1 = month;  y1 = year;   d2 = other.day;  m2 = other.month;  y2 = other.year;  }   int[] daysOfMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  if(isLeapYear(y1))  daysOfMonth[1] = 29;   while(d1 != d2 || m1 != m2 || y1 != y2){  days  ;  d1  ;  if(d1 gt; daysOfMonth[m1-1]){  d1 = 1;  m1  ;  if(m1 gt; 12){  y1  ;  m1 = 1;  if(isLeapYear(y1))  daysOfMonth[1] = 29;  else  daysOfMonth[1] = 28;  }  }  }   days = days * sign;  return days;  }   public String longDate() {  String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};  return months[month-1]   " "   day   ", "   year;  }  public String toString() {  String s = month   "/"   day   "/"   year;  return s;  }  public static int daysTo(Date one, Date two) {  return one.daysTo(two);  }  }  

Программа для тестирования

 public class Assign8B { // Part of the main method I'll use to test your class // NO imports allowed from the JAVA API public static void main(String[] a) {  Date one = new Date(10,15,1582); // start of Gregorian  Date two = new Date(1,28,2020); // 2020 is a leap year    one.addDays(1); // advance one day (negative subtracts days)  one.addWeeks(10); // advance one week (negative allowed, yes)  System.out.println(two.daysTo(one)); // -159645 days (negative)  System.out.println(one.getDay()); // day is now the 25th (advanced)  System.out.println(one.getMonth()); // returns 12, January is 1  System.out.println(one.getYear()); // still 1582 from start  System.out.println(one.isLeapYear()); // false for 1582  System.out.println(one.toString()); // style is 12/25/1582    try {  Date three = new Date(12,33,1956); // obviously illegal  Date four = new Date(2,29,2013); // illegal leap year  three.setDay(31); // fixes that day of month, OK  four.setMonth(3); // fixes the month, year still wrong  four.setYear(1929); // fixes the year, code not reached  } catch (IllegalArgumentException e) {  System.out.println("Illegal day attempted");  }    // Use UNIX zero of 01/01/70 for default, and create "longDate" output  // I thought a long date was dinner with a person you don't like?  Date five = new Date();  System.out.println(five.longDate()); // January 1, 1970    // Finally, let's understand what static methods are most commonly used for:  System.out.println(Date.daysTo(one, two)); // still 159645 days (positive) }  

}

Комментарии:

1. Хорошо, посмотрите на конструктор Date , public Date(int year, int month, int day) { затем посмотрите, как вы new Date(10, 15, 1582) его создаете , видите ли вы проблему? Одно это не вызовет бесконечных проблем

2. Вы должны указать, какие ошибки вы получаете от своей тестирующей программы.

3. Исключение в потоке «основной» java.lang. Незаконное исключение аргумента на сегодняшний день. lt;инициализацияgt;(Дата.java:15) в Assign8B.main(Assign8B.java:14)

4. Это относится к тому, что сказал МэдПрограммер.

5. @MadProgrammer Я изменил порядок построения, кодов ошибок больше нет. Однако консоль ничего не выводит.

Ответ №1:

Как упоминал @madprogrammer в комментариях, вам необходимо изменить вызов даты из-за порядка года и дня в вашем собственном конструкторе классов, а затем посмотрите на функцию добавления дней и измените способ добавления лет в свой код.