Oak*_*ork 133 java datetime calendar
我在计算当月的下一个最后一天是否为计划发送的通知时遇到问题.
这是我的代码:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
Run Code Online (Sandbox Code Playgroud)
这是引起我相信问题的界限:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
Run Code Online (Sandbox Code Playgroud)
如何使用日历正确设置通知的下个月的最后一天?
Ale*_*exR 325
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
Run Code Online (Sandbox Code Playgroud)
这将返回当前月份的实际最大值.例如现在是闰年的2月,所以它返回29 int.
Prz*_*mek 48
使用java.timeJava 8中内置的库,您可以使用TemporalAdjuster类(或TemporalAdjusters实用程序类)
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
LocalDate now = LocalDate.now(); //2015-11-23
LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); //2015-11-30
Run Code Online (Sandbox Code Playgroud)
如果您需要添加时间信息,可以使用任何可用的LocalDate到LocalDateTime转换
lastDay.atStartOfDay(); //2015-11-30T00:00
Run Code Online (Sandbox Code Playgroud)
yet*_*rSE 33
并将最后一天作为Date对象:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
Date lastDayOfMonth = cal.getTime();
Run Code Online (Sandbox Code Playgroud)
Mik*_*eck 21
您可以将日历设置为下个月的第一天,然后减去一天.
Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);
Run Code Online (Sandbox Code Playgroud)
运行此代码后,nextNotifTime将设置为当前月份的最后一天.请记住,如果今天是该月的最后一天,则此代码的净效果是Calendar对象保持不变.
Saf*_*ala 15
以下将始终给出正确的结果:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, ANY_MONTH);
cal.set(Calendar.YEAR, ANY_YEAR);
cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
cal.getTime();
Run Code Online (Sandbox Code Playgroud)
在java.time这里使用最新的库是最好的解决方案:
LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
Run Code Online (Sandbox Code Playgroud)
或者,您可以执行以下操作:
LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());
Run Code Online (Sandbox Code Playgroud)
小智 7
您也可以使用 YearMonth。
喜欢:
YearMonth.of(2019,7).atEndOfMonth()
YearMonth.of(2019,7).atDay(1)
Run Code Online (Sandbox Code Playgroud)
见 https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--