我需要使用日历来执行此方法,基本上我得到了星期几(1、2、3),每个int代表星期几(星期一,星期二)不是按此顺序,但是逻辑是这样。
我需要获取星期几的日期,假设今天是星期一,而用户选择Wednsesday,我需要获取下星期三的日期。
我目前的逻辑是:
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
dateMatch = calendar.getTime();
星期几是从slidePicker传递过来的,代表星期几,如果我把Wednseday放给我6,这DAY_OF_WEEK不起作用
选择日期后,在日历对象中添加7天,然后获取星期几日历
仅供参考,麻烦的旧日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)现在已被遗留,由内置在Java 8和Java 9中的java.time类取代。请参见Oracle教程。
tl; dr
要获取今天之后的下一个星期三,或者如果已经是星期三,则坚持今天的日期。
LocalDate.now( ZoneId.of("Africa/Tunis" ) )
.with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) )
java.time
使用现代的java.time类代替麻烦的旧的旧式日期时间类,例如Calendar。
使用dayOfWeek枚举对象表示星期一至星期日。使用智能对象而不是哑整数来表示您的星期几意图。使您的代码更具自记录性,确保有效值,并提供类型安全性。
LocalDate类表示没有日期和时区的仅日期值。
时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是"昨天"。
如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将您的期望/期望时区明确指定为参数。
以continent/region格式指定正确的时区名称,例如America/Montreal,Africa/Casablanca或Pacific/Auckland。切勿使用3-4个字母的缩写,例如EST或IST,因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of("America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
使用TemporalAdjuster实现(例如TemporalAdjusters.nextOrSame)移动到另一个日期。
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
LocalDate nextOrSameWednesday = today.with( ta ) ;
如果要处理片刻,请使用ZonedDateTime类,而不要使用可怕的Calendar类。如上所述,让TemporalAdjuster做繁重的工作。但是请记住,如果该日对新日期无效,例如在夏令时(DST)转换期间,则该日可能会更改。
ZoneId z = ZoneId.of("Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
ZonedDateTime zdtSameOrNextWednesday = zdt.with( ta ) ;
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧版旧式日期时间类,例如java.util.Date,Calendar和SimpleDateFormat。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要java.sql.*类。
在哪里获取java.time类?
Java SE 8,Java SE 9和更高版本
内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。
Java SE 6和Java SE 7
java.time的许多功能在ThreeTen-Backport中都被反向移植到Java 6和7。
安卓系统
更高版本的Android捆绑了java.time类的实现。
对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter等。
尽管您的问题文本仅说要找到下一个dayOfWeek,但是您的代码也包含一天中的某个时间,形式为hour和minute。
假设您希望该组合的第一个将来出现,即dayOfWeek,hour和minute,这意味着如果今天是那个dayOfWeek,或者您想要今天是今天的晚于现在的时间,或者如果一天中的时间早于现在,则下周。
您可以这样做:
int dayOfWeek = Calendar.WEDNESDAY;
int hour = 10; // 10 AM
int minute = 0;
Calendar cal = Calendar.getInstance(); // Today, now
if (cal.get(Calendar.DAY_OF_WEEK) != dayOfWeek) {
cal.add(Calendar.DAY_OF_MONTH, (dayOfWeek + 7 - cal.get(Calendar.DAY_OF_WEEK)) % 7);
} else {
int minOfDay = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
if (minOfDay >= hour * 60 + minute)
cal.add(Calendar.DAY_OF_MONTH, 7); // Bump to next week
}
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime()); // Prints: Wed May 10 10:00:00 EDT 2017
太棒了,但是有什么让我感到困惑,您没有设定不需要这样做的日子?
因为一天不能是今天+ 7天,所以用户选择了一天,今天是星期一,但是他可以选择星期三
@AntonioCosta是,星期三(4)-星期一(2)= 2,今天(星期一)+ 2天= 5月10日星期三。如果今天是星期四(5),则星期三(4)-星期四 (5)+ 7 = 6,并且5月11日,星期四+ 6天= 5月17日,星期三。代码没有设置星期几,而是计算要添加到当前日期的多少天才能到达该日期- 每周。
该死的,这真是太聪明了,真是个棒极了的答案,您是自己实施还是改编了,因为我从来没有找到这种解决方案,非常!