如果我的应用程序收到某个日期,我怎样才能找到下周一的第一个日期?
例如,我的日期是2011年9月28日,我必须在此日期之后找到第一个星期一的日期。
答案 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)
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.
java.util.Date&与Java / Android捆绑在一起的.Calendar类非常麻烦。避免它们。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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')) );