Java 通过指定星期几获取下一个日期

Java 通过指定星期几获取下一个日期,java,android,date,Java,Android,Date,我需要使用日历来做这个方法,基本上我得到了一周中的具体日期1,2,3,每个int代表一周中的一天星期二,星期二不是这个顺序,但逻辑是这样的 我需要的是获取一周中第二天的日期,假设今天是星期一,用户选择Wednesday,我需要获取下周三的日期 LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ) 目前我的逻辑是: calenda

我需要使用日历来做这个方法,基本上我得到了一周中的具体日期1,2,3,每个int代表一周中的一天星期二,星期二不是这个顺序,但逻辑是这样的

我需要的是获取一周中第二天的日期,假设今天是星期一,用户选择Wednesday,我需要获取下周三的日期

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )
目前我的逻辑是:

calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                dateMatch = calendar.getTime();

day of week是从一个slidePicker传递过来的,代表一周中的具体一天,这一天不起作用,如果我把Wednesday放在上面,他会给我6

虽然你的问题文本只说查找下一周的第二天,但你的代码还包括一天中的时间,以小时和分钟的形式

假设您希望该组合的未来第一次出现,即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

尽管您的问题文本仅表示查找下一个星期的dayOfWeek,但您的代码还包括一天中的时间,以小时和分钟的形式

假设您希望该组合的未来第一次出现,即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
tl;博士 今天之后的下一个星期三,如果已经是星期三,就坚持今天的日期

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )
java.time 使用现代的java.time类来取代旧的遗留日期时间类(如Calendar)

使用DayOfWeek枚举对象表示星期一和星期日。使用智能对象而不是哑整数来表示一周中的某一天。使代码更加自文档化,确保有效值,并提供类型安全性

该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

以大陆/地区的格式指定,例如,或太平洋/奥克兰。切勿使用3-4个字母的缩写,如EST或IST,因为它们不是真正的时区,不标准,甚至不是唯一的

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;
使用一个实现,例如移动到另一个日期

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
LocalDate nextOrSameWednesday = today.with( ta ) ;
如果使用时刻,请使用ZonedDateTime类,而不是糟糕的Calendar类。一些想法如上所述,让孩子们做举重。但请记住,如果一天中的某个时间对新日期无效,例如在切换期间,则该时间可能会被更改

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
ZonedDateTime zdtSameOrNextWednesday = zdt.with( ta ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android tl;博士 今天之后的下一个星期三,如果已经是星期三,就坚持今天的日期

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )
java.time 使用现代的java.time类来取代旧的遗留日期时间类(如Calendar)

使用DayOfWeek枚举对象表示星期一和星期日。使用智能对象而不是哑整数来表示一周中的某一天。使代码更加自文档化,确保有效值,并提供类型安全性

该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

以大陆/地区的格式指定,例如,或太平洋/奥克兰。切勿使用3-4个字母的缩写,如EST或IST,因为它们不是真的 ime区域,未标准化,甚至不唯一

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;
使用一个实现,例如移动到另一个日期

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
LocalDate nextOrSameWednesday = today.with( ta ) ;
如果使用时刻,请使用ZonedDateTime类,而不是糟糕的Calendar类。一些想法如上所述,让孩子们做举重。但请记住,如果一天中的某个时间对新日期无效,例如在切换期间,则该时间可能会被更改

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
ZonedDateTime zdtSameOrNextWednesday = zdt.with( ta ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。
对于早期的Android,在选择date之后在calendar对象中添加7天,然后获取dayofweek calendarFYI,像、和java.text.SimpleDateFormat这样麻烦的旧日期时间类现在被java 8和java 9中内置的类所取代。请参阅。在calendar对象中选择date add 7 days并获取dayofweek calendarFYI之后,诸如、和java.text.SimpleDateFormat等麻烦的旧日期时间类现在被java 8和java 9中内置的类所取代。看。太棒了,但有件事让我困惑,你不设定你不需要这样做的日期吗?因为日期不能是今天+7天,日期由用户选择,今天是星期一,但他可以选择wednesday@AntonioCosta是的,星期三4-星期一2=2,今天是星期一+2天=星期三,5月10日。如果今天是星期四5,那么星期三4-星期四5+7=6,星期四5月11日+6天=星期三5月17日。代码没有设置一周中的哪一天,但会计算当前日期的天数,以达到这一周中的哪一天。该死的,这真是太聪明了,这是一个多么棒的答案,伙计,你是自己实现的还是改编的,因为我从来没有找到过这种解决方案,太多了!:Dawesome,但是有件事让我困惑,你不设定你不需要这样做的日期吗?因为日期不能是今天+7天,日期由用户选择,今天是星期一,但他可以选择wednesday@AntonioCosta是的,星期三4-星期一2=2,今天是星期一+2天=星期三,5月10日。如果今天是星期四5,那么星期三4-星期四5+7=6,星期四5月11日+6天=星期三5月17日。代码没有设置一周中的哪一天,但会计算当前日期的天数,以达到这一周中的哪一天。该死的,这真是太聪明了,这是一个多么棒的答案,伙计,你是自己实现的还是改编的,因为我从来没有找到过这种解决方案,太多了!:D