有没有最简单的方法来判断某一天是否在本周内?(此函数返回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字段,并查看两者是否相同。这是什么意思?一周是指周日到周六吗?还是周一到周日?或者是ISO 8601周?
对于标准的ISO 8601周……
YearWeek.now( ZoneId.of( "America/Montreal" ) )
.equals(
YearWeek.from(
LocalDate.of( 2017 , Month.JANUARY , 23 )
)
)
Date
和Calendar
。YearWeek
类,假设您所说的“周”是标准的ISO 8601周。该类的文档总结了标准周的定义:大陆/地区
的格式指定一个正确的时区名称,例如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 8 及更高版本中。这些类取代了老旧且麻烦的传统日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
java.sql.*
类。Hibernate 5和JPA 2.2支持java.time。
如何获取java.time类?
更新: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
类,用于任何日期和时间相关的查询。
Calendar
现在已经过时,几年前被java.tine替代。在2018年推荐使用这些类是不好的建议。 - Basil Bourque简单的 Kotlin 解决方案:
fun isDateInCurrentWeek(date: DateTime): Boolean {
val cal = Calendar.getInstance()
cal.add(Calendar.DAY_OF_WEEK, 0)
var dt= DateTime(cal.timeInMillis)
return date in dt..dt.plusDays(6)
}
sDate
和startDateTime
应该是相同的吗?DateTime
是来自Joda-time还是Kotlin内置的东西? - Ole V.V.
java.util.Date
、java.util.Calendar
和java.text.SimpleTextFormat
等麻烦的旧日期时间类现在已经成为遗留系统,被 java.time类取代。请参见Oracle教程。 - Basil Bourque