生成给定月份和年份的日历
答
为什么不能这样?
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
日期时操作。
答
使用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类?
-
Java SE 8和SE 9后来
- 内置。
- 带捆绑实现的标准Java API的一部分。
- Java 9增加了一些次要功能和修复。在ThreeTen-Backport
-
Java SE 6和SE 7
- 大部分的java.time功能后移植到Java 6 & 7。
-
Android
- 的ThreeTenABP项目适应ThreeTen-反向移植(上述)为Android特异性。
- 参见How to use ThreeTenABP…。
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
“注意:我已经计算出每月包含的天数。” a)你可能做错了。很难做到这一点 - 有很多规则。 b)框架中已经有代码可以为你做到这一点。为什么自己写? – 2012-03-20 13:23:45
@Mark Byers:有完整代码的链接吗? – Nitish 2012-03-20 13:32:45