当前位置:  开发笔记 > 编程语言 > 正文

获取Java上个月的上周五

如何解决《获取Java上个月的上周五》经验,为你挑选了5个好方法。

我正在开发一个项目,其中要求将日期计算为给定月份的最后一个星期五.我想我有一个只使用标准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开发者.所以我会把它留给别人.



1> 小智..:

让Calendar.class为你做神奇的事;)

pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);



2> ColinD..:

基于标记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();
}


很好的答案.似乎是最短最简洁的.如果可以的话,我会再次修改它.

3> 小智..:

你永远不需要循环来找到它.要确定本月的"上周五"日期,请从下个月的第一天开始.减去适当的天数,具体取决于每月第一天的某一天(数字)日期.这是你的"上周五".我很确定它可以归结为一个冗长的单行,但我不是一个java开发者.所以我会把它留给别人.



4> Przemek..:
java.time

使用Java 8及更高版本中内置的java.time库,您可以使用TemporalAdjusters.lastInMonth:

val now = LocalDate.now() 
val lastInMonth = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY))

您可以从DayOfWeek枚举中选择任何一天.

如果您需要添加时间信息,可以使用任何可用LocalDateLocalDateTime转换方式

lastFriday.atStartOfDay() // e.g. 2015-11-27T00:00



5> Hans Doggen..:

我会使用像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);

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有