23

我有以下代码用于获取当前日期之前的最后一个星期日:

Calendar calendar=Calendar.getInstance();
calendar.set(Calendar.WEEK_OF_YEAR, calendar.get(Calendar.WEEK_OF_YEAR)-1);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Log.e("first day", String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));

但是这段代码不起作用。请告诉我,我该如何解决?

4

7 回答 7

32

java.time.temporal.TemporalAdjuster

这可以通过与枚举一起TemporalAdjuster找到 的实现来轻松实现。具体来说,。TemporalAdjustersDayOfWeekprevious​(DayOfWeek dayOfWeek)

 LocalDate
 .now()
 .with(
     TemporalAdjusters.previous( DayOfWeek.SUNDAY )
 ) ;

如果今天是星期天,并且您希望结果是今天而不是一周前,请致电previousOrSame​(DayOfWeek dayOfWeek)

 LocalDate
 .now()
 .with(
     TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY )
 ) ;

这些类内置于 Java 8 及更高版本,并内置于 Android 26 及更高版本。对于 Java 6 和 7,大部分功能都在ThreeTen-Backport中向后移植。对于早期的 Android,请参阅ThreeTenABP

于 2017-04-14T11:01:50.693 回答
27

这将起作用。我们首先得到天数,然后用当天减去它并加 1(代表星期天)

Calendar cal=Calendar.getInstance();
cal.add( Calendar.DAY_OF_WEEK, -(cal.get(Calendar.DAY_OF_WEEK)-1)); 
System.out.println(cal.get(Calendar.DATE));

编辑:正如Basil Bourque在评论中 指出的那样,请参阅Grzegorz Gajos对 Java 8 及更高版本的回答。

于 2012-10-08T14:29:08.843 回答
6

您可以以一天为单位进行迭代,直到您在周日到达:

Calendar cal = Calendar.getInstance();
while (cal.get( Calendar.DAY_OF_WEEK ) != Calendar.SUNDAY)
    cal.add( Calendar.DAY_OF_WEEK, -1 );

或者,只需一步,减去星期天和现在之间的天数差:

Calendar cal = Calendar.getInstance();
int dayOfTheWeek = cal.get( Calendar.DAY_OF_WEEK );
cal.add( Calendar.DAY_OF_WEEK, Calendar.SUNDAY - dayOfTheWeek );
于 2012-10-08T13:58:09.947 回答
1
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(cal.getTimeInMillis() //
     // Saturday is the 7th day of week, so use modulo to get it : remove day between todoay
     - (( cal.get(Calendar.DAY_OF_WEEK) % 7) * 86400000)); // 86400000=24*60*60*1000

System.out.println(cal.getTime());
. . .
于 2012-10-08T14:52:57.083 回答
0

无论哪个月份和年份,以下内容都对我有用。

 Calendar cal = Calendar.getInstance(TimeZone.getDefault());
 Date date = cal.getTime();
 int days = cal.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
 date.setTime(date.getTime() - (long) (days*1000*60*60*24));
 cal.setTime(date);
于 2015-01-26T07:32:54.757 回答
0

这是使用 Joda 计算一周中任何最后一天的片段:

import org.joda.time.DateTime
import org.joda.time.DateTimeConstants

DateTime now = DateTime();
int offset = ((now.dayOfWeek - DateTimeConstants.THURSDAY) + 7) % 7;
DateTime lastThursday = now.minusDays(offset);

只需替换DateTimeConstants.THURSDAY为您选择的日期即可。

于 2016-09-01T13:19:52.560 回答
0

这是使用 Kotlin 扩展和Joda Time 库的方法。
答案基于 linqu 的答案,但这也修复了该答案中的错误。错误在于,如果当前日期与您尝试获取的日期相同,则它不起作用。

/**
 * E.g., DateTimeConstants.SUNDAY
 */
fun DateTime.previousDayOfWeek(day: Int): DateTime {
    var date = this
    if(date.dayOfWeek == day) date = date.minusDays(1)

    val offset = (date.dayOfWeek - day + 7) % 7
    return date.minusDays(offset)
}

fun DateTime.previousSunday(): DateTime {
    return previousDayOfWeek(DateTimeConstants.SUNDAY)
}
于 2020-01-22T17:33:41.377 回答