【问题标题】:How to get the past Sunday and the coming Sunday in Java? [duplicate]如何在 Java 中获取过去的星期日和即将到来的星期日? [复制]
【发布时间】:2010-12-27 01:52:16
【问题描述】:

我问了How to detect if a date is within this or next week in Java?,但答案令人困惑,所以现在我想如果我能找到过去的星期日和即将到来的星期日,这两者之间的任何一天都是本周,以及即将到来的星期日和之后的星期日之间的任何一天是下周,我说的对吗?

所以我的新问题是:如何在 Java 中获取过去的星期日和即将到来的星期日?

【问题讨论】:

  • 如果今天是星期天应该怎么办?
  • 如果今天是星期日,则为本周 7 天的第一天,从今天早上 00:00 开始,直到下周日的 00:00 为本周。

标签: java date


【解决方案1】:

java.time

简单地说:

LocalDate.now().with( next( SUNDAY ) ) 

看到这个code run live at IdeOne.com

详情

我想我会为后代添加一个 Java 8 解决方案。使用 TemporalAdjusters 类中的 LocalDateDayOfWeekTemporalAdjuster 实现。

final LocalDate today = LocalDate.of(2015, 11, 20);
final LocalDate nextSunday = today.with(next(SUNDAY));
final LocalDate thisPastSunday = today.with(previous(SUNDAY));

这种方法也适用于其他时间类,例如 ZonedDateTime

import

正如所写,它假定以下静态导入:

import java.time.LocalDate;
import static java.time.DayOfWeek.SUNDAY;
import static java.time.temporal.TemporalAdjusters.next;
import static java.time.temporal.TemporalAdjusters.previous;

【讨论】:

  • 很好的解决方案,谢谢
【解决方案2】:

这个怎么样:

Calendar c=Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
c.set(Calendar.HOUR_OF_DAY,0);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss");
System.out.println(df.format(c.getTime()));      // This past Sunday [ May include today ]
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime()));      // Next Sunday
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime()));      // Sunday after next

结果:

Sun 2010/12/26 00:00:00
Sun 2011/01/02 00:00:00
Sun 2011/01/09 00:00:00

前两天之间的任何一天都是本周,最后两天之间的任何一天都是下周。

【讨论】:

  • 不是最佳答案。 java.util.Date 和 .Calendar 类非常糟糕,以至于 Sun/Oracle 都放弃了它们。新的java.time package 现在捆绑在 Java 8 中以取代旧的类。 Joda-Time 启发了 java.time 并具有一些卓越的功能。
  • 如果你不能使用Java 8,这个解决方案很漂亮!在 Android 上,我们仅限于 Java 6 api!
  • 对于那些寻求 Java 8 解决方案的人,我在下面发布了答案。
  • 在三星手机上,它给出的是周日而不是过去的周日,所以我减去了一周。 if (c.getTimeInMillis() > today.getTimeInMillis()) { c.set(Calendar.WEEK_OF_MONTH, today.get(Calendar.WEEK_OF_MONTH) - 1); }
  • 仅供参考,诸如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle
【解决方案3】:

不使用更好的时间/日期包...

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
Calendar now = new GregorianCalendar();
Calendar start = new GregorianCalendar(now.get(Calendar.YEAR), 
        now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) );

while (start.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
    start.add(Calendar.DAY_OF_WEEK, -1);
}

Calendar end = (Calendar) start.clone();
end.add(Calendar.DAY_OF_MONTH, 7);

System.out.println(df.format(now.getTime()) );
System.out.println(df.format(start.getTime()) );
System.out.println(df.format(end.getTime()) );

如果今天是星期日,则将其视为时间段的开始。如果您想要本周和下周的一段时间(从您的问题中听起来),您可以在 end.add(...) 行中替换 14 而不是 7。将时间设置为午夜,以便比较介于开始和结束之间的另一个对象。

【讨论】:

    【解决方案4】:

    首先,不要使用 Java 中的 Date/Time 包。有一个更好的实用程序包,名为 Joda-Time - 下载并使用它。

    要确定您的时间是在本周、上周还是任何一周,请执行以下操作:

    1. 创建两个 Interval 对象 - 一个用于上周,一个用于本周
    2. 使用 contains(long) 方法确定哪个区间包含您要查找的日期。

    您可以通过几种很酷的方式来创建两个背靠背的星期。您可以设置一周的持续时间,找到第一周的开始时间,然后根据该开始时间创建两个间隔。随意寻找适合您的任何其他方式 - 该软件包有多种方式可以实现您想要的。


    编辑:

    Joda-Time 可以是 downloaded here,下面是 Joda 如何执行此操作的示例:

    // Get the date today, and then select midnight of the first day of the week
    // Joda uses ISO weeks, so all weeks start on Monday.
    // If you want to change the time zone, pass a DateTimeZone to the method toDateTimeAtStartOfDay()
    DateTime midnightToday = new LocalDate().toDateTimeAtStartOfDay();
    DateTime midnightMonday = midnightToday.withDayOfWeek( DateTimeConstants.MONDAY );
    
    // If your week starts on Sunday, you need to subtract one.  Adjust accordingly.
    DateTime midnightSunday = midnightMonday.plusDays( -1 );
    
    DateTime midnightNextSunday = midnightSunday.plusDays( 7 );
    DateTime midnightSundayAfter = midnightNextSunday.plusDays( 7 );
    
    Interval thisWeek = new Interval( midnightSunday, midnightNextSunday );
    Interval nextWeek = new Interval( midnightNextSunday, midnightSundayAfter );
    
    if ( thisWeek.contains( someDate.getTime() )) System.out.println("This week");
    if ( nextWeek.contains( someDate.getTime() )) System.out.println("Next week");
    

    【讨论】:

    【解决方案5】:

    给出下周日的代码,您可以轻松找出如何找到过去的周日。

    private static void nextSunday() throws ParseException 
        {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    
            Calendar calendar = Calendar.getInstance();
    
            calendar.setTime(new Date());
            int weekday = calendar.get(Calendar.DAY_OF_WEEK);
            int days = Calendar.SUNDAY - weekday;
            if (days < 0)
            {
                days += 7;
            }
            calendar.add(Calendar.DAY_OF_YEAR, days);
    
            System.out.println(sdf.format(calendar.getTime()));
        }
    

    【讨论】:

    【解决方案6】:

    我最近开发了Lamma Date,它旨在解决这个用例:

    Date today = new Date(2014, 7, 1);      // assume today is 2014-07-01
    Date previousSunday = today.previousOrSame(DayOfWeek.SUNDAY);   // 2014-06-29
    Date nextSunday = today.next(DayOfWeek.SUNDAY);                 // 2014-07-06
    

    【讨论】:

      【解决方案7】:

      http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html

      我推荐 Calendar.get(Calendar.DAY_OF_WEEK)

      【讨论】:

      • 我建议在使用 Java 内置的 Date 东西之前跳出窗口... ;)
      • 跳出窗外可能有点激进,除非你在一楼工作,但我当然同意避免Calendar 和设计不佳的朋友。幸运的是,在写完这个答案之后,java.time, the modern Java date and time API, 已经出来了。我强烈推荐它。
      【解决方案8】:

      您可以尝试使用 Calendar.WEEK_OF_YEAR 字段,该字段为您提供当前年份中一周的数字表示。

      @Test
      public void testThisAndNextWeek() throws Exception {
          GregorianCalendar lastWeekCal = new GregorianCalendar(2010,
                  Calendar.DECEMBER, 26);
          int lastWeek = lastWeekCal.get(Calendar.WEEK_OF_YEAR);
      
          GregorianCalendar nextWeekCal = new GregorianCalendar(2011,
                  Calendar.JANUARY, 4);
          int nextWeek = nextWeekCal.get(Calendar.WEEK_OF_YEAR);
      
          GregorianCalendar todayCal = new GregorianCalendar(2010,
                  Calendar.DECEMBER, 27);
          int currentWeek = todayCal.get(Calendar.WEEK_OF_YEAR);
      
          assertTrue(lastWeekCal.before(todayCal));
          assertTrue(nextWeekCal.after(todayCal));
          assertEquals(51, lastWeek);
          assertEquals(52, currentWeek);
          // New Year.. so it's 1
          assertEquals(1, nextWeek);
      }
      

      【讨论】:

        【解决方案9】:

        我的解决方案:

            LocalDate date = ...;
            LocalDate newWeekDate = date.plusDays(1);
            while (newWeekDate.getDayOfWeek() != DayOfWeek.SATURDAY &&
                   newWeekDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
                newWeekDate = date.plusDays(1);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-02
          相关资源
          最近更新 更多