我想知道如何让我的程序计算一周内的星期日数。
我尝试过以下内容:
if (date.DAY_OF_WEEK == date.SUNDAY) {
System.out.println("Sunday!");
}
然而它似乎不起作用?
当我尝试System.out.Println the date.DAY_OF_WEEK
时,我得到:7
有谁知道如何检查当前日历日期是否为星期日?
更新更多信息
所有日期的日期.DAY_OF_WEEK是一个日历对象!
我确保将日历对象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");
}
答案 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)
boolean todayIsSunday = LocalDate.now( ZoneId.of( "America/Montreal" ) ).getDayOfWeek().equals( DayOfWeek.SUNDAY ) ;
其他答案已过时。现代方法使用 java.time 类。
LocalDate
LocalDate
类表示没有日期,没有time zone或offset-from-UTC的仅日期值。
时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。
如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的期望/期望时区明确指定为参数。如果紧急,请与您的用户确认区域。
以Continent/Region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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-safety。 Year
和YearMonth
的同上。
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 ) ;
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。