68

如何使用Joda-Time API 获得下一个星期五。

今天LocalDatetoday. 在我看来,您必须决定是在本周的星期五之前还是之后。看这个方法:

private LocalDate calcNextFriday(LocalDate d) {
    LocalDate friday = d.dayOfWeek().setCopy(5);
    if (d.isBefore(friday)) {
        return d.dayOfWeek().setCopy(5);
    } else {
        return d.plusWeeks(1).dayOfWeek().setCopy(5);
    }
}

是否可以缩短或使用oneliner?

PS:请不要建议我使用 JDK 日期/时间的东西。Joda-Time 是一个更好的 API。

Java 8 引入了更好的java.time包(Tutorial)。

4

8 回答 8

108

java.time

使用Java 8 及更高版本(教程)中内置的java.time框架,您可以使用获取下一个上一个星期几TemporalAdjusters

private LocalDate calcNextFriday(LocalDate d) {
  return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
}
于 2015-03-12T12:53:26.800 回答
52

可以以更容易阅读的方式来做到这一点:

if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) {
    return d.withDayOfWeek(DateTimeConstants.FRIDAY));
} else if (d.getDayOfWeek() == DateTimeConstants.FRIDAY) {
    // almost useless branch, could be merged with the one above
    return d;
} else {
    return d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY));
}

或者更短的形式

private LocalDate calcNextFriday(LocalDate d) {    
    if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) {
        d = d.withDayOfWeek(DateTimeConstants.FRIDAY));
    } else {
        d = d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY));
    }    
    return d; // note that there's a possibility original object is returned
}

甚至更短

private LocalDate calcNextFriday(LocalDate d) {
    if (d.getDayOfWeek() >= DateTimeConstants.FRIDAY) {
        d = d.plusWeeks(1);
    }
    return d.withDayOfWeek(DateTimeConstants.FRIDAY);
}

PS。我没有测试实际代码!:)

于 2009-10-28T09:56:04.767 回答
5

您的代码在 1 行中

private LocalDate calcNextFriday3(LocalDate d) {
    return d.isBefore(d.dayOfWeek().setCopy(5))?d.dayOfWeek().setCopy(5):d.plusWeeks(1).dayOfWeek().setCopy(5);
}

替代方法

private LocalDate calcNextDay(LocalDate d, int weekday) {
    return (d.getDayOfWeek() < weekday)?d.withDayOfWeek(weekday):d.plusWeeks(1).withDayOfWeek(weekday);
}


private LocalDate calcNextFriday2(LocalDate d) {
    return calcNextDay(d,DateTimeConstants.FRIDAY);
}

有点测试;-)

于 2009-10-28T10:06:44.037 回答
4

我只是浪费了大约 30 分钟试图自己解决这个问题,但我需要大体上向前推进。

无论如何,这是我的解决方案:

public static DateTime rollForwardWith(ReadableInstant now, AbstractPartial lp) {
    DateTime dt = lp.toDateTime(now);
    while (dt.isBefore(now)) {
        dt = dt.withFieldAdded(lp.getFieldTypes()[0].getRangeDurationType(), 1);
    }
    return dt;
}

现在您只需要为一周中的某一天制作一个 Partial(LocalDate 是)。

Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY); 

现在,如果当前日期在它之后(现在),那么无论最重要的字段是什么,都将是 +1。

也就是说,如果您使用 2012 年 3 月进行部分设置,它将创建 2013 年 3 月或 <.

于 2012-07-18T03:01:39.273 回答
4
import java.util.Calendar;

private Calendar getNextweekOfDay(int weekOfDay) {
    Calendar today = Calendar.getInstance();
    int dayOfWeek = today.get(Calendar.DAY_OF_WEEK);
    int daysUntilNextWeekOfDay = weekOfDay - dayOfWeek;
    if (daysUntilNextWeekOfDay == 0) daysUntilNextWeekOfDay = 7;
    Calendar nextWeekOfDay = (Calendar)today.clone();
    nextWeekOfDay.add(Calendar.DAY_OF_WEEK, daysUntilNextWeekOfDay);
    return nextWeekOfDay;
}

// set alarm for next Friday 9am
public void setAlarm() {
    Calendar calAlarm = getNextweekOfDay(Calendar.FRIDAY);
    calAlarm.set(Calendar.HOUR_OF_DAY, 9);//9am
    calAlarm.set(Calendar.MINUTE, 0);
    calAlarm.set(Calendar.SECOND, 0);
    scheduleAlarm(calAlarm);// this is my own method to schedule a pendingIntent
}
于 2015-06-16T07:19:51.210 回答
3

计数字节@fvu 答案可以进一步缩短为:

private LocalDate calcNextFriday(LocalDate d) {
  return d.plusWeeks(d.getDayOfWeek() < DateTimeConstants.FRIDAY ? 0 : 1).withDayOfWeek(DateTimeConstants.FRIDAY);
}
于 2014-10-06T10:18:11.827 回答
0

一个简单的基于模数的解决方案,它应该适用于大多数以前的 java 版本,以防你不允许将你的 java 版本升级到 java8 或更高版本,或者使用标准的 java 日期库作为 jodatime

添加到您的日期的天数由以下公式给出:

(7 + Calendar.FRIDAY - yourDateAsCalendar.get(Calendar.DAY_OF_WEEK)) % 7

另请注意,这可以通过将静态字段 Calendar.FRIDAY 更改为您给定的工作日来推广到任何工作日。下面的一些片段代码

public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {

        Calendar cur = Calendar.getInstance();
        cur.add(Calendar.DAY_OF_MONTH, i);

        Calendar friday = Calendar.getInstance();
        friday.setTime(cur.getTime());
        friday.add(Calendar.DAY_OF_MONTH, (7 + Calendar.FRIDAY - cur.get(Calendar.DAY_OF_WEEK)) % 7);

        System.out.println(MessageFormat.format("Date {0} -> {1} ", cur.getTime(),  friday.getTime()));
    }
}
于 2018-11-22T01:39:29.473 回答
0

这是一种替代方法,无需使用 LocalDate 之外的任何其他类/API。

     LocalDate nextFriday = (d.plusWeeks(1).withDayOfWeek(5).minusDays(7).isAfter(d)) 
                            ? d.plusWeeks(1).withDayOfWeek(5)
                            : d.withDayOfWeek(5);
于 2021-03-08T11:57:17.540 回答