我正在开发一个项目,其中要求将日期计算为给定月份的最后一个星期五。 我想我有一个只使用标准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());
    }

===============>>#1 票数:36

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

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

===============>>#2 票数: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();
}

===============>>#3 票数:10

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

===============>>#4 票数:9

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 票数:7

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

===============>>#6 票数:2

您需要知道两件事 - 本月的天数以及本月的第一天的工作日。

如果该月的第一天是

  • 星期天,那么最后一个星期五总是 27日。
  • 星期一,那么最后一个星期五总是 26日。
  • 周二,那么上周五总是 25日。
  • 星期三,那么最后一个星期五是24日,除非这个月有31天,那么它是第31天
  • 星期四,那么最后一个星期五是23日,除非这个月有30天或更长时间,那么它是30日。
  • 星期五,那么最后一个星期五是22日,除非本月有29天或更长时间,那么它是第29天。
  • 星期六,那么最后一个星期五总是 28日。

只有三个特例。 一个switch语句和三个if语句(如果你喜欢每个case都有一行三元运算符......)

在纸上解决。 不需要任何特殊的库,函数,朱利安转换等(好吧,除了让第一个工作日到来,也许那个月的天数......)

Aaron用Java实现了它。

-亚当

===============>>#7 票数:2

Adam Davis算法的代码

public static int getLastFriday(int month, int year)
{
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1, 0, 0, 0); // set to first day of the month
cal.set(Calendar.MILLISECOND, 0);

int firstDay = cal.get(Calendar.DAY_OF_WEEK);
int daysOfMonth = cal.getMaximum(Calendar.DAY_OF_MONTH);

switch (firstDay)
{
    case Calendar.SUNDAY :
        return 27;
    case Calendar.MONDAY :
        return 26;
    case Calendar.TUESDAY :
        return 25;
    case Calendar.WEDNESDAY :
        if (daysOfMonth == 31) return 31;
        return 24;
    case Calendar.THURSDAY :
        if (daysOfMonth >= 30) return 30;
        return 23;
    case Calendar.FRIDAY :
        if (daysOfMonth >= 29) return 29;
        return 22;
    case Calendar.SATURDAY :
        return 28;
}
throw new RuntimeException("what day of the month?");
}}

===============>>#8 票数:1

以下程序是每个月的最后一个星期五。 它可以用来获取任何一个月中任何一天的最后一天。 变量offset=0表示当前月份(系统日期),offset = 1表示下个月,依此类推。 getLastFridayofMonth(int offset)方法将返回上周五。

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class LastFriday {

  public static Calendar getLastFriday(Calendar cal,int offset){
    int dayofweek;//1-Sunday,2-Monday so on....
    cal.set(Calendar.MONTH,cal.get(Calendar.MONTH)+offset);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); //set calendar to last day of month
    dayofweek=cal.get(Calendar.DAY_OF_WEEK); //get the day of the week for last day of month set above,1-sunday,2-monday etc
    if(dayofweek<Calendar.FRIDAY)  //Calendar.FRIDAY will return integer value =5 
      cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)-7+Calendar.FRIDAY-dayofweek);
    else
      cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)+Calendar.FRIDAY-dayofweek); 

    return cal;
  }

  public static String  getLastFridayofMonth(int offset) { //offset=0 mean current month
    final String DATE_FORMAT_NOW = "dd-MMM-yyyy";
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    cal=getLastFriday(cal,offset);
    return sdf.format(cal.getTime()); 

  }

  public static void main(String[] args) {
    System.out.println(getLastFridayofMonth(0)); //0 = current month
    System.out.println(getLastFridayofMonth(1));//1=next month
    System.out.println(getLastFridayofMonth(2));//2=month after next month
  }

}

===============>>#9 票数:1

在Java 8中,我们可以简单地这样做:

LocalDate lastFridayOfMonth = LocalDate
                                    .now()
                                    .with(lastDayOfMonth())
                                    .with(previous(DayOfWeek.FRIDAY));

===============>>#10 票数:1

稍微容易阅读,蛮力方法:

public int getLastFriday(int month, int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, 1, 0, 0, 0); // set to first day of the month
    cal.set(Calendar.MILLISECOND, 0);

    int friday = -1;
    while (cal.get(Calendar.MONTH) == month) { 
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) { // is it a friday?
            friday = cal.get(Calendar.DAY_OF_MONTH);
            cal.add(Calendar.DAY_OF_MONTH, 7); // skip 7 days
        } else {
            cal.add(Calendar.DAY_OF_MONTH, 1); // skip 1 day
        }
    }
    return friday;
}

===============>>#11 票数:1

虽然我同意scubabbl,但这是一个没有内在的版本。

int year = 2008;
for (int m = Calendar.JANUARY; m <= Calendar.DECEMBER; m++) {
    Calendar cal = new GregorianCalendar(year, m, 1);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    int diff = Calendar.FRIDAY - cal.get(Calendar.DAY_OF_WEEK);
    if (diff > 0) {
        diff -= 7;
    }
    cal.add(Calendar.DAY_OF_MONTH, diff);
    System.out.println(cal.getTime());
}

===============>>#12 票数:1

这是如何获得本月的最后一个星期五或任何工作日:

Calendar thisMonth = Calendar.getInstance();
dayOfWeek = Calendar.FRIDAY; // or whatever
thisMonth.set(Calendar.WEEK_OF_MONTH, thisMonth.getActualMaximum(Calendar.WEEK_OF_MONTH);;
thisMonth.set(Calendar.DAY_OF_WEEK, dayOfWeek);
int lastDay = thisMonth.get(Calendar.DAY_OF_MONTH); // this should be it.

===============>>#13 票数:0

希望这可以帮助..

public static void getSundaysInThisMonth(int monthNumber, int yearNumber){
    //int year =2009;
    //int dayOfWeek = Calendar.SUNDAY;
    // instantiate Calender and set to first Sunday of 2009
    Calendar cal = new GregorianCalendar();
    cal.set(Calendar.MONTH, monthNumber-1);
    cal.set(Calendar.YEAR, yearNumber);
    cal.set(Calendar.DATE, 1);
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
    int dateOfWeek = cal.get(Calendar.DATE);
    while (dayOfWeek  != Calendar.SUNDAY) {
       cal.set(Calendar.DATE, ++dateOfWeek);
       dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
      }
    cal.set(Calendar.DATE, dateOfWeek);

    int i = 1;
    while (cal.get(Calendar.YEAR) == yearNumber && cal.get(Calendar.MONTH)==monthNumber-1)
    {
            System.out.println("Sunday " + " " + i + ": " + cal.get(Calendar.DAY_OF_MONTH));
            cal.add(Calendar.DAY_OF_MONTH, 7);
            i++;
    }

  }
  public static void main(String args[]){
    getSundaysInThisMonth(1,2009);
  }

===============>>#14 票数:0

public static int lastSundayDate()
{
    Calendar cal = getCalendarInstance();
    cal.setTime(new Date(getUTCTimeMillis()));
    cal.set( Calendar.DAY_OF_MONTH , 25 );
    return (25 + 8 - (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY ? cal.get(Calendar.DAY_OF_WEEK) : 8));
}

===============>>#15 票数:0

这看起来是完全可以接受的解决方案 如果可行,请使用它。 这是最小的代码,除非必须,否则没有理由对其进行优化。

===============>>#16 票数:-1

public static Calendar getNthDow(int month, int year, int dayOfWeek, int n) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, 1);
    cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, n);
    return (cal.get(Calendar.MONTH) == month) && (cal.get(Calendar.YEAR) == year) ? cal : null;
}

  ask by Nick Klauer translate from so

未解决问题?本站智能推荐:

3回复

Android / Java - 测试日期是否为上个月

我正在开发一个应用程序,我在每次使用之间存储一些信息,这些数据基本上归结为计算今天,本周,本月和应用程序生命周期中事件发生的次数。 我将这些数据存储在4个不同的计数器中,我可以使用SharedPreferences加载/保存。 除了数据我将应用程序的“最后运行时间”存储为日期,我的计划是
2回复

获取上个月的第一个和最后一个日期[重复]

可能重复: 如何获得上个月的第一个日期和最后日期? (JAVA) 在java中,如何获取上个月的第一个和最后一个日期? 如果我没有错,以下代码将获取上个月的最后日期。 如果我错了,请纠正我。 谢谢。
2回复

没有JODA的上个月的月结束日期

我有一个来自请求的日期,例如2014年8月15日,如何使用java,lang.Calendar在Java中计算上个月的结束日期(2014年7月31日)。 我们不使用JODA时间。
1回复

获取上周和上个月的开始和结束日期

获取上周和上个月的开始和结束日期。 我需要上周的开始日期和结束日期[开始日期是星期一,结束日期是星期日] 以及上个月的开始日期和结束日期
7回复

如何从指定日期获取上周五的日期? [重复]

这个问题已经在这里有了答案: 时间:如何获得下一个星期五? 7个答案 如何找出最近(上一个)“星期五”或指定日期之后的其他日期的日期?
4回复

检索上周一和周五的日期的最佳方法是什么

我需要得到上周一和周五的日期。 为此,我将获得本周一的日期并减去7天。 这给了我上周一的星期一。 为了得到星期五的日期,我必须加上4.这让我感到困惑,因为出于某种原因,一周的第一天是星期日,而不是星期一在英国。 无论如何,这是我如何得到日期。 上述工作,但我感兴趣,如果逻
2回复

获取上个星期一的月份

我有一个问题是获得上个星期一的正确日期。 我认为在这个问题中计算它并不是绝对正确的,并且想要用常量拒绝算术运算。 此代码按预期工作: 但是当我在构造函数体的Calendar.DAY_OF_MONTH第二条指令中将Calendar.MONTH设置为1时,返回2月的星期一。 我希望函数
1回复

Java获取给定日期的下个月的第一天[重复]

这个问题已经在这里有了答案: 如何获得一个月第一天的名字? 8个答案 我正在尝试做一些非常简单的事情,获取一个Date并从中获取下个月的第一天。 我尝试使用日历。 这里的日期是Calendar类型。 当我使用日期作为cal.set(2016,11,30
2回复

Java:在给定的日期范围内,每3个月的第一周获取天数

例如:日期范围是从2013年1月3日到2013年10月3日。在上述范围内,获取每3个月的第一周的所有工作日。 结果将是这样的: 我想出了一种方法,但是代码看起来很丑陋,所以我想知道是否有任何方法会更优雅? 感谢您的帮助,我真的很感激。 PS对不起,如果代码使您大失所望,我知道
3回复

如何获取某个月的所有日期

当我使用这些代码时,会得到我们所在月份的日期。例如,我可以看到介于01/09/2017到21/09/2017之间的日期。 但是,我需要特定月份的日期。 如何查看其他月份中的其他日期? 例如,我想查看四月的日期。 不应该是九月。 (我知道它与today.clone()有关,但我不知