需要帮助了解下面的测试代码。具体来说,我不明白calendar.set方法中“11”和“12”代表什么?例如“openCal.set(11,openHrs)。
public static void main(String[] args) {
{
int openHrs = 07;
int openMins = 30;
int closedHrs = 23;
int closedMins = 00;
Calendar cal = Calendar.getInstance();
Calendar openCal = Calendar.getInstance();
openCal.set(11, openHrs);
openCal.set(12, openMins);
Calendar closeCal = Calendar.getInstance();
closeCal.set(11, closedHrs);
closeCal.set(12, closedMins);
if(openCal.before(cal) && closeCal.after(cal))
{
System.out.println("The Business is OPEN");
} else
{
System.out.println("The Business is CLOSED");
}
}
}
答案 0 :(得分:4)
这是我们应该避免magic numbers的原因的完美示例。
而不是set(11
代码应该看起来像set(Calendar.HOUR_OF_DAY
而不是set(12
代码应该看起来像set(Calendar.MINUTE
。
如果您查看Calendar课程的文档,您会发现很少有关于如何使用set方法的示例,例如
set(Calendar.MONTH, Calendar.SEPTEMBER)
set(Calendar.DAY_OF_MONTH, 30)
通过查看Calendar类的source code,您会发现许多常量及其值。它们也可以在
找到http://docs.oracle.com/javase/8/docs/api/constant-values.html
所以你看到了
11
- > (click here to check) 12
- > (click here to check) 答案 1 :(得分:1)
只需深入了解日历源代码,magic numbers
与以下字段绑定
private static final String[] FIELD_NAME = {
"ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH",
"DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR",
"HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET",
"DST_OFFSET"
};
因此,在这种情况下,您可以看到11
是HOUR_OF_DAY且12
是MINUTE
答案 2 :(得分:1)
你在哪看这个教程?在具有两个参数的Calendar的set函数中,第一个参数是数据所在的索引,第二个参数是要设置的值。所以从代码中可以看出11代表小时数,12代表分钟数。文档位于http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html。数字应该替换为Calendar类中的常量,以使此代码更具可读性并自行回答您的问题。
答案 3 :(得分:1)
Calendar
s get
和set
方法使用整数作为第一个参数,这些参数指示应分别更改的字段。这可能看起来很奇怪,但是Calendar
比Java中的Enum
更早(考虑到Java与日期相关的类中的所有其他愚蠢,这个是次要的)。
正如其他人所指出的,唯一可接受的做法是使用Calendar(HOUR_OF_DAY
等)中定义的常量,但在语法上, [expletive removed] < / em>程序员也可以使用数值文字(甚至是导致int
值的表达式。)
答案 4 :(得分:0)
LocalTime now = LocalTime.now( ZoneId.of( "America/Montreal" ) );
Boolean isOpenNow =
( ! now.isBefore( LocalTime.of( 7 , 30 ) ) )
&&
now.isBefore( LocalTime.of( 23 , 00 ) )
;
Answer by Pshemo是正确的,应该被接受。
使用java.time类取代的麻烦的旧日期时间类,问题和答案已经过时了。
LocalTime
LocalTime
classe表示没有日期且没有时区的时间。
LocalTime opening = LocalTime.of( 7 , 30 );
LocalTime closing = LocalTime.of( 23 , 00 );
确定当前时间需要一个时区。在任何特定时刻,时区(和日期)都按地区不同而变化。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( z );
我们可以将LocalTime
个对象与compareTo
,equals
,isAfter
和isBefore
进行比较。
在这个示例代码中,我们使用半开放方法来定义时间跨度,其中开头是包含,而结尾是独占。这种方法是合理且常用的。在整个代码中使用这种方法可以使您的逻辑更容易理解,并且使错误的可能性降低。所以我们问“当前时刻是否与开始相同或更晚,但也早于停止?”。更简洁的说法是:
现在不是早于开始AND现在 早于停止?
Boolean isOpenNow = ( ! now.isBefore( opening ) ) && now.isBefore( closing ) ;