我正在开发一个项目,其中要求将日期计算为给定月份的最后一个星期五.我想我有一个只使用标准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()); }
小智.. 36
让Calendar.class为你做神奇的事;)
pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY); pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
ColinD.. 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(); }
很好的答案.似乎是最短最简洁的.如果可以的话,我会再次修改它. (2认同)
小智.. 10
你永远不需要循环来找到它.要确定本月的"上周五"日期,请从下个月的第一天开始.减去适当的天数,具体取决于每月第一天的某一天(数字)日期.这是你的"上周五".我很确定它可以归结为一个冗长的单行,但我不是一个java开发者.所以我会把它留给别人.
让Calendar.class为你做神奇的事;)
pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY); pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
基于标记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(); }
你永远不需要循环来找到它.要确定本月的"上周五"日期,请从下个月的第一天开始.减去适当的天数,具体取决于每月第一天的某一天(数字)日期.这是你的"上周五".我很确定它可以归结为一个冗长的单行,但我不是一个java开发者.所以我会把它留给别人.
使用Java 8及更高版本中内置的java.time库,您可以使用TemporalAdjusters.lastInMonth
:
val now = LocalDate.now() val lastInMonth = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY))
您可以从DayOfWeek
枚举中选择任何一天.
如果您需要添加时间信息,可以使用任何可用LocalDate
的LocalDateTime
转换方式
lastFriday.atStartOfDay() // e.g. 2015-11-27T00:00
我会使用像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);