如何检查一天是在Java的当前周?
是否有最简单的方法可以找到当天的任何一天? (此函数返回true或false,与给定日相关的是当前周或不是)。
你肯定想使用Calendar类: http : //docs.oracle.com/javase/6/docs/api/java/util/Calendar.html
这是一种方法:
public static boolean isDateInCurrentWeek(Date date) { Calendar currentCalendar = Calendar.getInstance(); int week = currentCalendar.get(Calendar.WEEK_OF_YEAR); int year = currentCalendar.get(Calendar.YEAR); Calendar targetCalendar = Calendar.getInstance(); targetCalendar.setTime(date); int targetWeek = targetCalendar.get(Calendar.WEEK_OF_YEAR); int targetYear = targetCalendar.get(Calendar.YEAR); return week == targetWeek && year == targetYear; }
使用Calendar
类获取YEAR和WEEK_OF_YEAR字段,看看两者是否相同。
请注意,结果将根据区域设置而有所不同,因为不同的文化对于哪一天是一周的第一天有不同的意见。
TL;博士
什么是一周? 星期天星期六? 星期一星期天? ISO 8601周 ?
对于标准的ISO 8601周……
YearWeek.now( ZoneId.of( "America/Montreal" ) ) .equals( YearWeek.from( LocalDate.of( 2017 , Month.JANUARY , 23 ) ) )
java.time
现代方法使用java.time类来取代麻烦的旧日期时间类,例如Date
& Calendar
。
此外, ThreeTen-Extra项目为我们的目的提供了一个方便的YearWeek
课程,假设标准的ISO 8601周是您在“周”这个词时所考虑的。 该类的文档总结了标准周的定义:
ISO-8601将星期定义为始终从星期一开始。 第一周是包含日历年第一个星期四的一周。 因此,本课程中使用的以周为基础的年份与日历年不一致。
时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如, 法国巴黎午夜过后几分钟,在魁北克蒙特利尔的 “昨天”仍然是新的一天。
以continent/region
的格式指定适当的时区名称 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4字母缩写,例如EST
或IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ); YearWeek ywNow = YearWeek.now( z ) ; // Get the current week for this specific time zone.
LocalDate
类表示没有时间且没有时区的仅日期值。
LocalDate ld = LocalDate.of( 2017 , Month.JANUARY , 23 ) ; // Some date.
要查看特定日期是否包含在目标YearWeek
对象的日期中,请获取该日期的YearWeek
并通过调用equals
进行比较。
YearWeek ywThen = YearWeek.from( ld ) ; // Determine year-week of some date. Boolean isSameWeek = ywThen.equals( ywNow ) ;
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
乔达时间
更新: Joda-Time项目现在处于维护模式 ,团队建议迁移到java.time类。 留下这部分完整的历史。
在Joda-Time 2.3中检查ISO周很容易。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. // import org.joda.time.*; DateTimeZone parisTimeZone = DateTimeZone.forID( "Europe/Paris" ); DateTime now = new DateTime( parisTimeZone ); DateTime yesterday = now.minusDays( 1 ); DateTime inThree = now.plusDays( 3 ); DateTime inFourteen = now.plusDays( 14 ); System.out.println( "Now: " + now + " is ISO week: " + now.weekOfWeekyear().get() ); System.out.println( "Same ISO week as yesterday ( " + yesterday + " week "+ yesterday.weekOfWeekyear().get() +" ): " + ( now.weekOfWeekyear().get() == yesterday.weekOfWeekyear().get() ) ); System.out.println( "Same ISO week as inThree ( " + inThree + " week "+ inThree.weekOfWeekyear().get() +" ): " + ( now.weekOfWeekyear().get() == inThree.weekOfWeekyear().get() ) ); System.out.println( "Same ISO week as inFourteen ( " + inFourteen + " week "+ inFourteen.weekOfWeekyear().get() +" ): " + ( now.weekOfWeekyear().get() == inFourteen.weekOfWeekyear().get() ) );
跑的时候……
Now: 2013-12-12T06:32:49.020+01:00 is ISO week: 50 Same ISO week as yesterday ( 2013-12-11T06:32:49.020+01:00 week 50 ): true Same ISO week as inThree ( 2013-12-15T06:32:49.020+01:00 week 50 ): true Same ISO week as inFourteen ( 2013-12-26T06:32:49.020+01:00 week 52 ): false
这个答案适用于Android。 将您选择的日期日历对象放在下面的方法中,以检查您选择的日期是否是当前周日期 。
private boolean isCurrentWeekDateSelect(Calendar yourSelectedDate) { Date ddd = yourSelectedDate.getTime(); Calendar c = Calendar.getInstance(); c.setFirstDayOfWeek(Calendar.MONDAY); c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); Date monday = c.getTime(); Date nextMonday= new Date(monday.getTime()+7*24*60*60*1000); return ddd.after(monday) && ddd.before(nextMonday); }
Android已经为任何日期和时间相关的查询提供了java.util.Calendar
类。