检查日历日期是否为星期日

时间:2012-11-30 14:46:24

标签: java date calendar

我想知道如何让我的程序计算一周内的星期日数。

我尝试过以下内容:

if (date.DAY_OF_WEEK == date.SUNDAY) {
    System.out.println("Sunday!");
}

然而它似乎不起作用?

当我尝试System.out.Println the date.DAY_OF_WEEK时,我得到:7

有谁知道如何检查当前日历日期是否为星期日?

更新更多信息

  1. 所有日期的日期.DAY_OF_WEEK是一个日历对象!

  2. 我确保将日历对象date设置为星期日

  3. 当我尝试运行date.DAY_OF_MONTH时,即使它设置为星期日这一天,我获得7的系统输出就是它返回给我的

    第二次更新到ALEX

    这或多或少是我的代码

    Calendar startDate = Calendar.getInstance();
    
        startDate.set(2012, 12, 02);
        if (startDate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            System.out.println("true");
        }else {
            System.out.println("FALSE");
        }
    

3 个答案:

答案 0 :(得分:24)

Calendar cal = ...;
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
    System.out.println("Sunday!");
}

Calendar.DAY_OF_WEEK始终等于7,无论您使用的是Calendar的哪个实例(see this link),它都是一个与{{1}一起使用的常量}}方法来检索正确的值。

Calendar.get()的调用将返回一周中的实际日期。此外,您会在Calendar.get(Calendar.DAY_OF_WEEK)类中找到有用的值,例如Calendar(以及其他日期和月份),以便您在代码中更明确,并避免出现Calendar.SUNDAY之类的错误等于JANUARY

修改

就像我说的那样,0类确实包含了有用的常量供您使用。没有月份编号Calendar他们从12开始(见上文),因此{1}}是Java日期处理中的月份编号0

DECEMBER

当然会打印11

答案 1 :(得分:2)

注意: Joda-Time项目现在处于维护模式。如果您不必使用旧代码,请参阅this answer


如果您需要经常使用日期或时间,可能需要尝试使用Joda-Time

您的代码看起来像这样:

LocalDate startDate = new LocalDate(2012, 12, 2);
int day = startDate.dayOfWeek().get();   // gets the day of the week as integer

if (DateTimeConstants.SUNDAY == day) {
    System.out.println("It's a Sunday!");
}

您还可以从dayOfWeek()获取文字字符串:

String dayText = startDate.dayOfWeek().getAsText();

将返回字符串“Sunday”。

答案 2 :(得分:1)

tl; dr

boolean todayIsSunday = LocalDate.now( ZoneId.of( "America/Montreal" ) ).getDayOfWeek().equals( DayOfWeek.SUNDAY ) ;

java.time

其他答案已过时。现代方法使用 java.time 类。

LocalDate

LocalDate类表示没有日期,没有time zoneoffset-from-UTC的仅日期值。

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

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的期望/期望时区明确指定为参数。如果紧急,请与您的用户确认区域。

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

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

如果要使用JVM的当前默认时区,请提出要求并作为参数传递。如果省略,代码将变得难以理解,因为我们不确定您是否打算使用默认值,还是像许多程序员一样不知道该问题。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或指定日期。您可以用数字设置月份,一月至十二月的理智编号为1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者更好的是,使用预定义的Month枚举对象,每年的每个月使用一个。提示:在整个代码库中使用这些Month对象,而不是仅使用整数,可以使您的代码更具自记录性,确保有效值并提供type-safetyYearYearMonth的同上。

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

DayOfWeek

对于任何LocalDate,您都可以将其星期几作为DayOfWeek对象。 DayOfWeek枚举会自动实例化七个对象,每个实例每天一次。

boolean isSunday = ld.getDayOfWeek().equals( DayOfWeek.SUNDAY ) ;

每周一个星期日

  

计算一周中的星期天数。

那将是1,总是每周一个星期日。

如果您的目标是寻找下一个星期日,请使用TemporalAdjuster类中定义的TemporalAdjusters

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.SUNDAY ) ;
LocalDate nextOrSameSunday = ld.with( ta ) ;

enter image description here


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore