Nic*_*uer 16 java calendar date
我正在开发一个项目,其中要求将日期计算为给定月份的最后一个星期五.我想我有一个只使用标准Java的解决方案,但我想知道是否有人知道更简洁或更有效的东西.以下是我今年测试的内容:
for (int month = 0; month < 13; month++) {
GregorianCalendar d = new GregorianCalendar();
d.set(d.MONTH, month);
System.out.println("Last Week of Month in " + d.getDisplayName(d.MONTH, Calendar.LONG, Locale.ENGLISH) + ": " + d.getLeastMaximum(d.WEEK_OF_MONTH));
d.set(d.DAY_OF_WEEK, d.FRIDAY);
d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
d.add(d.WEEK_OF_MONTH, -1);
}
Date dt = d.getTime();
System.out.println("Last Friday of Last Week in " + d.getDisplayName(d.MONTH, Calendar.LONG, Locale.ENGLISH) + ": " + dt.toString());
}
Run Code Online (Sandbox Code Playgroud)
小智 36
让Calendar.class为你做神奇的事;)
pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
Run Code Online (Sandbox Code Playgroud)
Col*_*inD 26
基于标记23的建议:
public Date getLastFriday( int month, int year ) {
Calendar cal = Calendar.getInstance();
cal.set( year, month + 1, 1 );
cal.add( Calendar.DAY_OF_MONTH, -( cal.get( Calendar.DAY_OF_WEEK ) % 7 + 1 ) );
return cal.getTime();
}
Run Code Online (Sandbox Code Playgroud)
小智 10
你永远不需要循环来找到它.要确定本月的"上周五"日期,请从下个月的第一天开始.减去适当的天数,具体取决于每月第一天的某一天(数字)日期.这是你的"上周五".我很确定它可以归结为一个冗长的单行,但我不是一个java开发者.所以我会把它留给别人.
Prz*_*mek 10
使用Java 8及更高版本中内置的java.time库,您可以使用TemporalAdjusters.lastInMonth:
val now = LocalDate.now()
val lastInMonth = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY))
Run Code Online (Sandbox Code Playgroud)
您可以从DayOfWeek枚举中选择任何一天.
如果您需要添加时间信息,可以使用任何可用LocalDate的LocalDateTime转换方式
lastFriday.atStartOfDay() // e.g. 2015-11-27T00:00
Run Code Online (Sandbox Code Playgroud)
我会使用像Jodatime这样的库.它有一个非常有用的API,它使用正常的月份数.最重要的是,它是线程安全的.
我认为你可以有一个解决方案(但可能不是最短的,但肯定更可读):
DateTime now = new DateTime();
DateTime dt = now.dayOfMonth().withMaximumValue().withDayOfWeek(DateTimeConstants.FRIDAY);
if (dt.getMonthOfYear() != now.getMonthOfYear()) {
dt = dt.minusDays(7);
}
System.out.println(dt);
Run Code Online (Sandbox Code Playgroud)