生成给定月份和年份的日历

问题描述:

如何在月和年输入参数时生成Calendar生成给定月份和年份的日历

注意:我已经计算了一个月中包含的天数。

+1

“注意:我已经计算出每月包含的天数。” a)你可能做错了。很难做到这一点 - 有很多规则。 b)框架中已经有代码可以为你做到这一点。为什么自己写? – 2012-03-20 13:23:45

+0

@Mark Byers:有完整代码的链接吗? – Nitish 2012-03-20 13:32:45

为什么不能这样?

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.MONTH, month); 

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.MONTH, Calendar.MAY); // note this is a 0-11 value for jan-dec 
calendar.set(Calendar.DATE, 20); // pick the 20th day...or whatever from input 

注意,做这种方式会自动重新计算其余字段(如多少天都在一个月,等)。您还可以使用日历上的add()函数来添加日期,并且它也会考虑所有这些。

参见:http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html

Calendar c = Calendar.getInstance(); 
c.set(Calendar.MONTH, month); // 0-based 
c.set(Calendar.YEAR, year); 

当然,我建议使用joda-timeDateTime代替Calendar日期时操作。

+0

我们将什么设置到日历实例以及如何继续? – Nitish 2012-03-20 13:31:24

+0

你说你有月份和年份。这就是你说的。 (见javadoc) – Bozho 2012-03-20 13:36:28

+0

好吧,我们正在设定月份和年度,但下一步会是什么?我之前没有使用过日历实例。那么有详细的描述? – Nitish 2012-03-20 13:44:05

使用java.time

现代的方式是与取代麻烦的老传统Calendar & Date类java.time类。

YearMonth

YearMonth类代表,那么,一年一个月,没有任何日期或或时区天时间 - 。

YearMonth ym = YearMonth.of(2017 , Month.MARCH); 

LocalDate

您可以生成一个LocalDate

LocalDate firstOfMonth = ym.atDay(1); 
LocalDate endOfMonth = ym.atEndOfMonth(); 

如果你想在两者之间的日期,循环。一次增加日期一天。检查每天是否仍然在相同的YearMonth。如果不是,你增加得太多,可以停止。

List<LocalDate> dates = new ArrayList<>(31); 
LocalDate localDate = ym.atDay(1); 
while (YearMonth.from(localDate).equals(ym) { 
    dates.add(localDate); 
    // Set up the next loop. 
    localDate = localDate.plusDays(1); 
} 

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore