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

Ant*_*sta 1 java android date

我需要使用日历来执行这种方法,基本上我得到特定的星期几(1,2,3)每个 int 代表一周中的一天(星期一,星期二)不是按这个顺序,但逻辑是这样的。

我需要的是获取星期几的日期,假设今天是星期一,用户选择星期三,我需要获取下一个星期三的日期。

目前我的逻辑是这样的:

calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                dateMatch = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

星期几是从一个 SlidePicker 传递过来的,代表星期几,这个 DAY_OF_WEEK 不起作用,如果我把 Wednseday 他给我 6

Bas*_*que 6

太长了;博士

\n\n

要获取今天之后的下一个星期三,或者如果已经是星期三,则坚持使用今天\xe2\x80\x99s 日期。

\n\n
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )\n    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )\n
Run Code Online (Sandbox Code Playgroud)\n\n

java.time

\n\n

使用现代java.time类取代了麻烦的旧遗留日期时间类,例如Calendar.

\n\n

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

\n\n

该类LocalDate表示仅日期值,没有时间和时区。

\n\n

时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而Montr\xc3\xa9al Qu\xc3\xa9bec中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d 。

\n\n

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

\n\n

以、、 或 等格式指定正确的时区名称。切勿使用 3-4 个字母的缩写,例如或,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

\n\n
ZoneId z = ZoneId.of( "America/Montreal" ) ;  \nLocalDate today = LocalDate.now( z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用TemporalAdjuster诸如TemporalAdjusters.nextOrSame移动到另一个日期之类的实现。

\n\n
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;\nLocalDate nextOrSameWednesday = today.with( ta ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果使用时刻,请使用ZonedDateTime类而不是糟糕的Calendar类。上面的一些想法,让TemporalAdjuster繁重的工作交给他们吧。但请记住,如果该时间对于新日期无效(例如在夏令时 (DST) 转换期间),则可能会更改该时间

\n\n
ZoneId z = ZoneId.of( "Pacific/Auckland" );\nZonedDateTime zdt = ZonedDateTime.now( z ) ;\nTemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;\nZonedDateTime zdtSameOrNextWednesday = zdt.with( ta ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

关于java.time

\n\n

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

\n\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

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

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n


And*_*eas 5

虽然您的问题文本只说 to find next dayOfWeek,但您的代码还包括一天中的时间,形式为hourand 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
Run Code Online (Sandbox Code Playgroud)