每年 11 月的最后一个星期五拜访

Calling last Friday in November every year

我有一个手动调用2020年月份最后一个星期五的代码,需要代码识别并调用每年11月的最后一个星期五,谁能帮忙,谢谢.

    Calendar lastday = Calendar.getInstance();
    int month = lastday.get(Calendar.MONTH);
    int dayOfMonth = lastday.get(Calendar.DAY_OF_MONTH);
    if(month == Calendar.NOVEMBER && dayOfMonth == 27){
        .....
    }

你的答案:

Calendar lastday = Calendar.getInstance();
int month = lastday.get(Calendar.MONTH);
int dayOfMonth = lastday.get(Calendar.DAY_OF_MONTH);
int day = lastday.get(Calendar.DAY_OF_WEEK); 
if(month == Calendar.NOVEMBER && dayOfMonth >= 24 && day == Calendar.FRIDAY){
    .....
}

您可以使用以下解决方案。通过更改 calendar.set(Calendar.MONTH, Calendar.NOVEMBER),它应该可以用于任何月份:

public int getLastFridayOfNovember() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.MONTH, Calendar.NOVEMBER);

    int totalDaysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    calendar.set(Calendar.DAY_OF_MONTH, totalDaysInMonth);

    int daysToRollBack = (calendar.get(Calendar.DAY_OF_WEEK) + 1) % 7;
    return totalDaysInMonth - daysToRollBack;
}

用法很简单:

...
int lastDayOfNovember = getLastFridayOfNovember();

如果你使用Kotlin,也可以是扩展函数:

fun Calendar.getLastFridayOfMonth(): Int {
    val totalDaysInMonth = getActualMaximum(Calendar.DAY_OF_MONTH)
    this[Calendar.DAY_OF_MONTH] = totalDaysInMonth
    val daysToRollBack = (this[Calendar.DAY_OF_WEEK] + 1) % 7
    return totalDaysInMonth - daysToRollBack
}

用法:

val calendar = Calendar.getInstance()
// set month
calendar.set(Calendar.MONTH, Calendar.NOVEMBER);
// get last Friday of given month
val lastFridayOfNovember = calendar.getLastFridayOfMonth()

java.time 通过脱糖或通过 ThreeTenABP

始终考虑使用 java.time,现代的 Java 日期和时间 API,用于约会工作。对于像你这里这样有点复杂的查询更是如此。

    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    boolean isLastFridayOfNovember = today.getMonth().equals(Month.NOVEMBER)
            && today.equals(today.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)));
    System.out.println("Is it the last Friday in November? " + isLastFridayOfNovember);

我今天(11 月 12 日,星期四)运行 时的输出:

Is it the last Friday in November? false

表达式today.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)) 计算当月的最后一个星期五。如果 today 等于计算的日期并且我们在 11 月,那么我们在 11 月的最后一个星期五。

要计算给定年份 11 月的最后一个星期五:

    int year = 2021;
    LocalDate lastFridayInNovember = LocalDate.of(year, Month.NOVEMBER, 30)
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY));
    
    System.out.println(lastFridayInNovember);

2021-11-26

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接