【问题标题】:Check if the Calendar date is a sunday检查日历日期是否为星期日
【发布时间】:2012-11-30 14:46:24
【问题描述】:

我想弄清楚如何让我的程序计算一周中的星期日数。

我尝试了以下方法:

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 设置为星期日

当我尝试运行 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");
    }

【问题讨论】:

  • numberOfSundaysInAWeek = 1
  • 使用日期折旧。你应该参加日历课程。
  • 对不起,我没有说清楚日期。DAY_OF_WEEK 是一个日历对象
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle

标签: java date calendar


【解决方案1】:
Calendar cal = ...;
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
    System.out.println("Sunday!");
}

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

调用Calendar.get(Calendar.DAY_OF_WEEK) 将返回星期几。此外,您将在 Calendar 类中找到有用的值,例如 Calendar.SUNDAY(以及其他日期和月份),以便您在代码中更加明确并避免像 JANUARY 等于 0 这样的错误。

编辑

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

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

当然会打印true

【讨论】:

  • 这个:日历 cal = startDate; System.out.println(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SUNDAY);是假的
  • 在该示例中,添加了一个新的 SimpleDateFormat("dd/MM/yyyy").parse("02/12/2012") 我使用日期对象设置我的日历的地方可能是有问题吗?
  • 请显示完整的代码,以便我了解发生了什么。
  • 因为这似乎不起作用: if (startDate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { System.out.println("true"); }
  • @Ramiro 在最新版本的工具中,desugaring makes available to earlier Android many of the Java 8 APIs。这包括 java.time 的一大子集。如果去糖还不够,请使用 ThreeTenABP 库将大部分 java.time 向后移植到早期的 Android。有关链接,请参阅my Answer。所以没有必要使用那些糟糕的遗留日期时间类。
【解决方案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”。

【讨论】:

  • 仅供参考,Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。见Tutorial by Oracle
  • 是的,我知道。我将把这个答案留给使用遗留代码的用户。您的回答很棒,我会投票并从我的链接中链接到它。感谢您的评论!
【解决方案3】:

tl;博士

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 月的编号为 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,总是每周一个星期日。

如果您的目标是找到下周日,请使用在 TemporalAdjusters 类中定义的 TemporalAdjuster

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


关于java.time

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

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

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获取 java.time 类?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多