Java新手日历类问题

Java新手日历类问题,java,Java,需要帮助理解下面的测试代码。具体来说,我不明白calendar.set方法中的“11”和“12”代表什么?示例“openCal.set(11,openHrs) 这是一个完美的例子,说明了为什么我们应该避免 而不是set(11code应该看起来像set(日历.HOUR\u of_DAY) 而不是set(12code应该看起来像set(Calendar.MINUTE) 若你们看一看这个类的文档,你们会发现一些关于如何使用像 set(日历.月份,日历.九月) set(日历日,每月30日) 通过查看

需要帮助理解下面的测试代码。具体来说,我不明白calendar.set方法中的“11”和“12”代表什么?示例“openCal.set(11,openHrs)


这是一个完美的例子,说明了为什么我们应该避免

而不是
set(11
code应该看起来像
set(日历.HOUR\u of_DAY

而不是
set(12
code应该看起来像
set(Calendar.MINUTE

若你们看一看这个类的文档,你们会发现一些关于如何使用像

  • set(日历.月份,日历.九月)
  • set(日历日,每月30日)
通过查看Calendar类的名称,您将发现许多常量及其值。它们也可以在

你看到了吗

  • 等于
    11
    ->
  • 等于
    12
    ->

只需深入了解日历源代码,这些
神奇数字
与以下字段关联

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
是一天中的小时,
12
是分钟,您在哪里看本教程?在具有两个参数的日历设置函数中,第一个参数是数据所在位置的索引,第二个是要设置的值。因此,从代码中可以看出,11是小时d 12表示分钟。文档位于。数字应替换为Calendar类中的常量,以使此代码更具可读性并能自动回答您的问题。

Calendar
s
get
set
方法使用整数作为第一个参数,指示应分别检索的字段这可能看起来很奇怪,但是Java中的
Calendar
Enum
s旧(考虑到Java中与日期相关的类中的所有其他愚蠢之处,这一个是次要的)

正如其他人所指出的,唯一可接受的做法是使用日历中定义的常量(
HOUR\u OF u DAY
等),但从语法上来说,[explate remove]程序员也可以使用数字文字(甚至是导致
int
值的表达式)。

tl 细节 这是正确的,应该被接受

避免遗留日期时间类 这些问题和答案已经过时了,使用的是麻烦的旧日期时间类,现在已经被java.time类取代

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
和进行比较

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

现在不早于开始,现在早于停止


你从哪里得到这些代码的?提示:避免使用java.util.Calendar和.Date类。它们是出了名的麻烦。使用java.time或Joda time。Joda time的DateTime类具有“with”“方法,如
withHourOfDay
。您也可以在API文档的部分中找到值。感谢大家。感谢快速、清晰的答案。因此我可以使用calendar.set(“HOUR\u of_DAY.”length(),9);奇怪的是,仍然更改Calendar.HOUR_OF_DAY字段……不仅有趣,您甚至可以在其他程序员发现您的代码后立即在www.thedailywtf.com上看到它。
LocalTime opening = LocalTime.of( 7 , 30 );
LocalTime closing = LocalTime.of( 23 , 00 );
ZoneId z = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( z );
Boolean isOpenNow = ( ! now.isBefore( opening ) ) && now.isBefore( closing ) ;