2015-10-07 3 views
1
public class MyCalendar { 

    GregorianCalendar greg = new GregorianCalendar(); 
    String[] month = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 
    String[] day = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 

    public void printMonth(int d, int m, int y) { 
    GregorianCalendar greg= new GregorianCalendar(greg.get(Calendar.YEAR), 
       greg.get(Calendar.MONTH), 1); 

      System.out.println(month[greg.get(Calendar.MONTH)]); 
      System.out.println(greg.get(Calendar.FRIDAY)); 
      System.out.println(greg.get(Calendar.SATURDAY)); 
    } 

У меня возникли проблемы с выяснением, почему greg.get (Calendar ._____) дает мне неожиданные значения.Григорианский календарь возвращает странные значения?

YEAR, MONTH, DATE all give me correct values: 2015, 9, 6 

FRIDAY returns 279 

SATURDAY returns 3 

SUNDAY returns 2015 

TUESDAY returns 41 

Может ли кто-нибудь объяснить мне, почему я получаю эти цифры? Я пытался узнать, как к дате всех суббот месяца, и подумал, что greg.get(Calendar.SATURDAY) может быть полезен в этом.

+0

Это не так, как вы предполагаете использовать 'get', предположим, например, использовать значение« Calendar.DATE »для значения даты или« Calendar.YEAR »для значения года. Поэтому использование 'Calendar.DAY_OF_WEEK' вернет значение, которое можно сопоставить с' Calendar.MONDAY' через 'Calendar.SUNDAY' – MadProgrammer

+2

О, и если вы используете Java 8, используйте новый API времени или просто используйте Joda Time – MadProgrammer

ответ

2

Итак, Calendar#get позволяет получить paritcular поле Calendar объекта, такие как DAY_OF_WEEK, который затем можно картировать обратно Calendar.MONDAY через Calendar.SUNDAY, чтобы сделать его проще понять обратный результат.

Таким образом, чтобы подсчитать количество SATURDAY с в месяц, вам нужно будет сначала найти первый SATURDAY (и да, я попытался с помощью cal.set(Calendar.DAY_OF_WEEK, Calendar.SATUDAY) после установки DATE, но это дало противоречивые результаты)

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.DATE, 1); 

while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) { 
    cal.add(Calendar.DATE, 1); 
} 

А потом просто подсчитывать вперед 7 дней, пока мы не оставить текущий месяц

int count = 0; 
int month = cal.get(Calendar.MONTH); 
while (cal.get(Calendar.MONTH) == month) { 
    count++; 
    cal.add(Calendar.DATE, 7); 
} 

System.out.println("This month has " + count + " saturdays"); 

Java 8

LocalDate date = LocalDate.now(); 
LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth()); 

date = date.withDayOfMonth(1); 
System.out.println(date); 
date = date.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SATURDAY.getValue()); 

int count = 0; 
while (date.isEqual(endOfMonth) || date.isBefore(endOfMonth)) { 
    count++; 
    date = date.plusDays(7); 
} 

System.out.println("You have " + count + " Saturdays"); 
+0

Спасибо, это помогает мне понять немного лучше. Первый раз пытается работать с Calendar/GregorianCalendar. Не так легко и просто, как я думал. – CodingNinjaInTraining

+0

О, и если у вас нет особых причин использовать «GregorianCalendar», было бы лучше использовать «Calendar.getInstance» – MadProgrammer

+0

Это для задания. Профессор сказал использовать GregorianCalendar ... – CodingNinjaInTraining

Смежные вопросы