特定日期后的第一个星期一?

时间:2011-09-27 07:05:37

标签: android

如果我的应用程序收到某个日期,我怎样才能找到下周一的第一个日期?

例如,我的日期是2011年9月28日,我必须在此日期之后找到第一个星期一的日期。

5 个答案:

答案 0 :(得分:9)

这样做:

GregorianCalendar date = new GregorianCalendar( year, month, day ); 

while( date.get( Calendar.DAY_OF_WEEK ) != Calendar.MONDAY )
  date.add( Calendar.DATE, 1 );

您现在可以从日期中提取年,日和月。请记住,月份为0(例如,1月= 0,2月份= 1等),而日期则不是。

答案 1 :(得分:3)

TL;博士

LocalDate.now( ZoneId.of( "America/Montreal" ) )                   // Capture the current date as seen by the people in a certain region (time zone).
         .with( TemporalAdjusters.next( DayOfWeek.WEDNESDAY ) ) ;  // Move to the following Wednesday.

避免使用.Date / .Calendar

java.util.Date&与Java / Android捆绑在一起的.Calendar类非常麻烦。避免它们。

java.time - LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

时区对于确定日期和星期几至关重要。使用proper time zone names,绝不使用3或4个字母代码。

如果忽略时区,则将隐式应用JVM的当前默认时区。这意味着将应用程序从一台计算机移动到另一台计算机时,或者当系统管理员更改主机时区时,或同一JVM中任何应用程序的任何线程中的任何Java代码决定调用setDefault即使在您的应用执行期间。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

TemporalAdjuster

使用TemporalAdjuster获取下周的某一天。我们可以在TemporalAdjusters(注意复数's')类中使用实现:next( DayOfWeek )。从方便的DayOfWeek枚举中传递一个对象。

LocalDate nextWednesday = today.with( TemporalAdjusters.next( DayOfWeek.WEDNESDAY ) );

如果您希望今天在周三找到,请拨打类似的调整员TemporalAdjusters.nextOrSame( DayOfWeek )


关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?


约达时间

更新 Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。这部分原封不动。

以下是使用Joda-Time 2.7的示例代码。

获取您想要/期望的时区。如果使用UTC,请使用常量DateTimeZone.UTC

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );

获取所需的日期时间值。我在这里使用当前时刻。

DateTime dateTime = DateTime.now( zone );

指定您想要的未来星期几。请注意,Joda-Time在一周的第一天使用明智的#1,而不是在java.util.Calendar中找到从零开始的计数。根据国际规范和标准(不是美国常见的星期日),每周的第一天是星期一。

int dayOfWeek = DateTimeConstants.SATURDAY;

withDayOfWeek命令可能会及时返回。因此,我们使用ternary operator (?:)确保我们根据需要添加一周,以便及时前进。

DateTime future = ( dateTime.getDayOfWeek() < dayOfWeek )
        ? dateTime.withDayOfWeek( dayOfWeek )
        : dateTime.plusWeeks( 1 ).withDayOfWeek( dayOfWeek );

您可能希望将时间调整为当天的第一时刻,以强调对当天的关注,而不是当天的特定时刻。

future = future.withTimeAtStartOfDay(); // Adjust time-of-day to first moment of the day to stress the focus on the entire day rather than a specific moment within the day. Or use `LocalDate` class.

转储到控制台。

System.out.println( "Next day # " + dayOfWeek + " after " + dateTime + " is " + future );

运行时。

Next day # 6 after 2015-04-18T16:03:36.146-04:00 is 2015-04-25T00:00:00.000-04:00

LocalDate

如果您只关心日期而没有任何时间,您可以使用LocalDate类而不是DateTime编写类似的代码。 “本地”表示日期可以适用于任何地区,而不是具有特定时区。

LocalDate localDate = new LocalDate( 2011 , 9 , 28 );

int dayOfWeek = DateTimeConstants.MONDAY;
LocalDate future = ( localDate.getDayOfWeek() < dayOfWeek )
        ? localDate.withDayOfWeek( dayOfWeek )
        : localDate.plusWeeks( 1 ).withDayOfWeek( dayOfWeek );

跑步时。

Next day # 1 after 2011-09-28 is 2011-10-03

答案 2 :(得分:1)

从下一个星期一开始。

  //code provided by MadProgrammer at http://stackoverflow.com/questions/24177516/get-first-next-monday-after-certain-date/24177555#24177555

  Calendar date1 = Calendar.getInstance();
  date1.set(2014, 05, 12);

  while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {

    date1.add(Calendar.DATE, 1);
}

System.out.println(date1.getTime());

哪个输出......

Mon Jun 16 16:22:26 EST 2014

答案 3 :(得分:1)

我最近开发了Lamma,旨在解决此用例。只需在next(DayOfWeek.MONDAY)对象上调用io.lamma.Date即可在下周一返回。

System.out.println(new Date(2014, 6, 27).next(DayOfWeek.MONDAY));   // Date(2014,6,30)

答案 4 :(得分:0)

你可以使用strtotime():

date('Y-m-d H:i:s', strtotime( "Next Monday", strtotime('28 Sep 2011')) );