【问题标题】:How to get the last Sunday before current date? [duplicate]如何获得当前日期之前的最后一个星期日? [复制]
【发布时间】:2012-09-28 18:50:28
【问题描述】:

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

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)));

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

【问题讨论】:

  • “此代码不起作用”究竟是什么意思,例如有什么例外吗?
  • 不,它显示的日期不正确。对不起。
  • 如果你是星期天,那你想要哪个星期天??当前还是最后一个??
  • 使用您的代码,它今天向我显示了正确的答案(即它在 2012 年 10 月 7 日打印)。并不意味着它通常是正确的。
  • 您在哪个 Android 版本上进行测试?在 Android 版本 Calendar.get(Calendar.WEEK_OF_YEAR) 中似乎存在错误。见anddev.org/other-coding-problems-f5/…

标签: java android calendar


【解决方案1】:

这会奏效。我们首先得到天数,然后用当天减去它并加 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 所指出的,请参阅 Java 8 及更高版本的 answer by Grzegorz Gajos

【讨论】:

  • 仅供参考:Calendar 类现在已经过时,遗留。对于现代解决方案,请参阅Grzegorz Gajos 的回答。
  • 感谢@BasilBourque 的关注,我用解决方案的链接更新了我的答案。
【解决方案2】:

java.time.temporal.TemporalAdjuster

这可以通过TemporalAdjusters 中的TemporalAdjuster 实现以及DayOfWeek 枚举轻松实现。具体来说,previous​(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

【讨论】:

    【解决方案3】:

    这是使用 Kotlin 扩展和 Joda Time library 的方法。
    答案基于 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)
    }
    

    【讨论】:

    【解决方案4】:

    这里有一个 sn-p 用于计算 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 替换为您选择的日期即可。

    【讨论】:

      【解决方案5】:

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

       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);
      

      【讨论】:

        【解决方案6】:
        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());
        . . .
        

        【讨论】:

          【解决方案7】:

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

          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 );
          

          【讨论】:

          • 可能有更有效的方法(我仍在思考),但这肯定会奏效!
          • @Duncan Jones:也许有更有效的方法,但我们谈论的是最多 6 次迭代。此解决方案应该会提供良好的结果。
          • @Viktor Seifert,如果在星期日运行,此代码将失败。
          • @Vash:不,它不会失败。这取决于您如何解释“当前日期之前的最后一个星期日”。如果您不希望它包含今天,您可以使用 do-while 循环。
          猜你喜欢
          • 1970-01-01
          • 2022-01-08
          • 2017-09-09
          • 2012-05-06
          • 1970-01-01
          • 2019-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多