2015-10-07 17 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.SUNDAY'返回一个可以匹配到'Calendar.MONDAY'的值。 – MadProgrammer

+2

哦,如果您使用的是Java 8,请使用新的Time API或仅使用Joda Time – MadProgrammer

回答

2

所以,Calendar#get可以让你得到Calendar对象的paritcular领域,如DAY_OF_WEEK,然后可以映射回Calendar.MONDAY通过Calendar.SUNDAY,使其更容易理解的返回结果。

所以,要计算的SATURDAY S IN一个月的数字,你需要先找到第一SATURDAY(是的,我尝试设置DATE后使用cal.set(Calendar.DAY_OF_WEEK, Calendar.SATUDAY),但它给了不一致的结果)

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