我需要使用日历来执行此方法,基本上我得到特定的星期几(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个
答案 0 :(得分:2)
虽然您的问题文字仅代表查找下一个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
答案 1 :(得分:2)
要在今天之后的下一个星期三,或者如果已经是星期三那么坚持今天的日期。
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
.with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) )
使用现代 java.time 类,这些类取代了麻烦的旧遗留日期时间类,例如Calendar
。
使用DayOfWeek
枚举对象表示星期一到星期日。使用智能对象而不是哑巴整数来表示您的星期几意图。使您的代码更加自我记录,确保有效值,并提供类型安全。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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
做重担。但请记住,如果某个时间段对于该新日期无效,例如在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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。