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

时间:2017-05-08 17:03:55

标签: java android date

我需要使用日历来执行此方法,基本上我得到特定的星期几(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传递,代表星期特定日期,这个DAY_OF_WEEK不起作用,如果我把Wednseday给他6个

2 个答案:

答案 0 :(得分:2)

虽然您的问题文字仅代表查找下一个dayOfWeek,但您的代码还包含一天中的某个时段,其格式为hourminute

假设您希望将来第一次出现该组合,即dayOfWeekhourminute,这意味着如果今天是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

答案 1 :(得分:2)

TL;博士

要在今天之后的下一个星期三,或者如果已经是星期三那么坚持今天的日期。

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )

java.time

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

使用DayOfWeek枚举对象表示星期一到星期日。使用智能对象而不是哑巴整数来表示您的星期几意图。使您的代码更加自我记录,确保有效值,并提供类型安全。

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

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

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

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

使用TemporalAdjusterTemporalAdjusters.nextOrSame实施移至另一个日期。

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
LocalDate nextOrSameWednesday = today.with( ta ) ;

如果处理片刻,请使用ZonedDateTime课程,而不是糟糕的Calendar课程。如上所述,让TemporalAdjuster做重担。但请记住,如果某个时间段对于该新日期无效,例如在Daylight Saving Time (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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore