Метод григорианского календаря

Я пытаюсь создать программу, которая принимает две даты в качестве аргументов и возвращает, относятся ли даты к текущей неделе или нет, но у меня проблема с вызовом isDateInCurrentWeek. Когда я пытаюсь скомпилировать программу, я получаю сообщение об ошибке

requestHoliday.java:16: isDateInCurrentWeek(java.util.GregorianCalendar) in requestHoliday cannot be applied to (java.util.Calendar)
      if (isDateInCurrentWeek(startDate) && isDateInCurrentWeek(endDate));

.

import java.util.*;
import java.text.*;

public class hols {
   public static void main( String[] args ) {
      DateFormat df = new SimpleDateFormat("dd MM yyyy");
      Date start = df.parse(args[0]);
      Date end = df.parse(args[1]);
      Calendar startDate = new GregorianCalendar();
      Calendar endDate = new GregorianCalendar();
      startDate.setTime(start);
      endDate.setTime(end);
      if( isDateInCurrentWeek( startDate ) && isDateInCurrentWeek( endDate ));
         System.out.println( "Date is in current week!" );
   }

   public static boolean isDateInCurrentWeek(GregorianCalendar date) {
      Calendar currentCalendar = GregorianCalendar.getInstance();
      int week = currentCalendar.get(Calendar.WEEK_OF_YEAR);
      int year = currentCalendar.get(Calendar.YEAR);
      Calendar targetCalendar = GregorianCalendar.getInstance();
      targetCalendar = date;
      int targetWeek = targetCalendar.get(Calendar.WEEK_OF_YEAR);
      int targetYear = targetCalendar.get(Calendar.YEAR);
      return week == targetWeek && year == targetYear;
   }
} 

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


person user1899174    schedule 19.02.2013    source источник
comment
Если вы используете API Joda-Time, вам больше никогда не придется ломать голову, Я совершенно уверен, что.   -  person Lion    schedule 20.02.2013


Ответы (2)


У вас есть ; в конце if, удалите его...

Григорианский календарь — это Календарь, а не наоборот. Измените подпись, чтобы использовать Календарь, если абстрактные и общие методы адаптированы к вашим потребностям. Когда это возможно, лучше использовать контракты, чем реализации, как описано в Что значит программировать для интерфейса? (спасибо Луигги).

hols id не является хорошим именем класса . Холс может быть лучше...

Этот код работает хорошо:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class Hols {
   public static void main( String[] args ) throws ParseException {
      DateFormat df = new SimpleDateFormat("dd MM yyyy");
      Date start = df.parse( args[0] );
      Date end   = df.parse( args[1] );
      Calendar startDate = new GregorianCalendar();
      Calendar endDate = new GregorianCalendar();
      startDate.setTime(start);
      endDate.setTime(end);
      if( isDateInCurrentWeek( startDate ) && isDateInCurrentWeek( endDate ))
         System.out.println( "Date is in current week!" );
      else
         System.out.println( "Date is NOT in current week!" );
   }

   public static boolean isDateInCurrentWeek( Calendar date ) {
      Calendar currentCalendar = Calendar.getInstance();
      int week = currentCalendar.get(Calendar.WEEK_OF_YEAR);
      int year = currentCalendar.get(Calendar.YEAR);
      Calendar targetCalendar = Calendar.getInstance();
      targetCalendar = date;
      int targetWeek = targetCalendar.get(Calendar.WEEK_OF_YEAR);
      int targetYear = targetCalendar.get(Calendar.YEAR);
      return week == targetWeek && year == targetYear;
   }
}
person Aubin    schedule 19.02.2013

Когда вы вызываете isDateInCurrentWeek, переменные, которые вы передаете, имеют тип Calendar. Вместо этого объявите их как GregorianCalendar.

Или, если вам не нужно ничего специфичного для GregorianCalendar, измените сигнатуру метода if isDateInCurrentWeek, чтобы принять Calendar.

person rgettman    schedule 19.02.2013
comment
Как это? GregorianCalendar startDate = new GregorianCalendar(); - person user1899174; 19.02.2013
comment
@ user1899174 он хочет изменить вашу функцию с isDateInCurrentWeek(GregorianCalendar) на isDateInCurrentWeek(Calendar) - person Luiggi Mendoza; 19.02.2013
comment
@ user1899174 - Да, это гарантирует, что JVM знает, что это GregorianCalendar. - person rgettman; 20.02.2013