如何在Java中检查一天是否为当前周?

8

有没有最简单的方法来判断某一天是否在本周内?(此函数返回true或false,与给定的日期是否在本周内有关)。

5个回答

29

你肯定想要使用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 currentCalendar = Calendar.getInstance();”而不是“Calendar currentCalendar = new Calendar();”。 - Ikrom
2
现在已经过时了。诸如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat等麻烦的旧日期时间类现在已经成为遗留系统,被 java.time类取代。请参见Oracle教程 - Basil Bourque
谢谢你的回答! - Ketan Mehta
1
周一,2018年12月31日和周三,2019年1月2日是否在同一周?对我来说是的。由于它们在不同的年份,你的代码会认为它们不在同一周。 - Ole V.V.

4
使用Calendar类获取YEAR和WEEK_OF_YEAR字段,并查看两者是否相同。
请注意,结果将因语言环境而异,因为不同的文化对一周的第一天有不同的看法。

2

简述

这是什么意思?一周是指周日到周六吗?还是周一到周日?或者是ISO 8601周

对于标准的ISO 8601周……

YearWeek.now( ZoneId.of( "America/Montreal" ) )
        .equals( 
            YearWeek.from( 
                LocalDate.of( 2017 , Month.JANUARY , 23 ) 
            ) 
        )

java.time

现代方法使用Java.time类,替换了麻烦的旧日期时间类,如DateCalendar
此外,ThreeTen-Extra项目为我们提供了一个方便的YearWeek类,假设您所说的“周”是标准的ISO 8601周。该类的文档总结了标准周的定义:
ISO-8601将一周定义为始终从星期一开始。第一周是包含日历年第一个星期四的那周。因此,这个类中使用的基于周的年份与日历年份不对齐。
时区对于确定日期非常重要。对于任何给定的时刻,日期在全球范围内会因为时区而有所不同。例如,在法国巴黎的午夜后几分钟是新的一天,但在加拿大魁北克省蒙特利尔仍然是“昨天”。
请以大陆/地区的格式指定一个正确的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。绝不能使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的标准化时区,也不是唯一的!
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.DateCalendarSimpleDateFormat

要了解更多,请参见Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310Joda-Time项目现在处于维护模式,建议迁移到java.time类。
您可以直接使用数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,也无需java.sql.*类。Hibernate 5和JPA 2.2支持java.time

如何获取java.time类?


Joda-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

0

这个答案是针对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类,用于任何日期和时间相关的查询。


2
令人头疼的Calendar现在已经过时,几年前被java.tine替代。在2018年推荐使用这些类是不好的建议。 - Basil Bourque
以上答案是针对Android的...而且Android已经提供了java.util.Calendar类来处理任何日期和时间相关的查询。 - Pankaj Talaviya
1
这个问题与Android无关。即使是针对Android,Android 26及更高版本都带有java.time的实现。对于早期的Android,ThreeTenABP项目可以适配ThreeTen-Backport项目,该项目将大部分java.time功能向后移植到Java 6和7中。请参见我的答案中的链接。没有理由再去使用那些可怕的旧日期时间类了。 - Basil Bourque
感谢您想为Android贡献答案。请在答案本身中说明(而不仅仅是在评论中),以便读者不会被误导。此外,我同意@BasilBourque的观点,建议使用“日历”和一些自制数学方法来提出这个复杂的解决方案,而没有提到更好的替代方案(如果您接受外部依赖项,则也适用于低版本的Android API)并不是一个好建议。 - Ole V.V.

0

简单的 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)
        }

你好像回答了一个不同的问题?也许是这样的一个问题:Java:如何检查日期是否在某个范围内? 另外,sDatestartDateTime应该是相同的吗?DateTime是来自Joda-time还是Kotlin内置的东西? - Ole V.V.
编辑。日期的使用取决于开发者的选择。 - Gulzar Bhat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接