Java新手日历类问题

时间:2014-06-27 12:53:51

标签: java

需要帮助了解下面的测试代码。具体来说,我不明白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");
         }
     }

}

5 个答案:

答案 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

所以你看到了

答案 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 getset方法使用整数作为第一个参数,这些参数指示应分别更改的字段。这可能看起来很奇怪,但是Calendar比Java中的Enum更早(考虑到Java与日期相关的类中的所有其他愚蠢,这个是次要的)。

正如其他人所指出的,唯一可接受的做法是使用Calendar(HOUR_OF_DAY等)中定义的常量,但在语法上, [expletive removed] < / em>程序员也可以使用数值文字(甚至是导致int值的表达式。)

答案 4 :(得分:0)

TL;博士

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个对象与compareToequalsisAfterisBefore进行比较。

在这个示例代码中,我们使用半开放方法来定义时间跨度,其中开头是包含,而结尾是独占。这种方法是合理且常用的。在整个代码中使用这种方法可以使您的逻辑更容易理解,并且使错误的可能性降低。所以我们问“当前时刻是否与开始相同或更晚,但也早于停止?”。更简洁的说法是:

  

现在不是早于开始AND现在 早于停止?

Boolean isOpenNow = ( ! now.isBefore( opening ) ) && now.isBefore( closing ) ;