Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在日历对象中设置日期时,我可以使用日/月/年引用吗?_Java_Date_Calendar - Fatal编程技术网

Java:在日历对象中设置日期时,我可以使用日/月/年引用吗?

Java:在日历对象中设置日期时,我可以使用日/月/年引用吗?,java,date,calendar,Java,Date,Calendar,我对Java世界还很陌生,而且我练习了很多。 我最后一次练习是关于一个公寓租赁计划。我的问题涉及到Manager类中的“预订”部分,在该部分中,我必须检查请求的到达日期是否与阵列双费率[]中的低、中或高季节批次相关联 下面是bookApartment()方法的代码部分,其中代码和id是公寓和客户散列图中的键(只有在到达日期为星期六时,预订才正确): 我在设置到达日期为2008年12月20日(被认为是旺季)的预订对象的价格时遇到了问题:它跳过第三个if检查(预期),直接转到最后一个else 但是,

我对Java世界还很陌生,而且我练习了很多。 我最后一次练习是关于一个公寓租赁计划。我的问题涉及到Manager类中的“预订”部分,在该部分中,我必须检查请求的到达日期是否与阵列双费率[]中的低、中或高季节批次相关联

下面是bookApartment()方法的代码部分,其中代码和id是公寓和客户散列图中的键(只有在到达日期为星期六时,预订才正确):

我在设置到达日期为2008年12月20日(被认为是旺季)的预订对象的价格时遇到了问题:它跳过第三个if检查(预期),直接转到最后一个else

但是,如果我运行自己的程序来检查日期是否相同,直接将值传递到日、月和年,测试就通过了

所以在我看来,我不能只传递不指向未手动设置的int值的引用。 有可能我是对的吗? 如果是这样,我真的不知道该怎么继续下去


提前感谢:我希望我在正确的位置使用了所有正确的单词。

当您获得日历实例时,它默认使用当前时间(精确到毫秒)。因此,在其中设置日期时:

Calendar date = Calendar.getInstance();
date.set(year, month-1, day);
。。。
日期
仍然保留小时、分钟、秒和毫秒的“随机”值。这同样适用于
date1
date6

在代码中,您会一个接一个地创建所有日期,因此执行这些指令的速度可能意味着前几个日期的小时、分钟、秒和毫秒值相同。然而,这并不能保证

您发现,例如,当您执行
date.equals(date3)
时,年、月、日匹配,但其他字段可能不匹配

要解决此问题,请先调用
clear()

Calendar date = Calendar.getInstance();
date.clear();
date.set(year, month-1, day);
此外,您可能实际上不想比较日历是否相等。可以,但如果您查看Javadoc,它会说:

 * Compares this <code>Calendar</code> to the specified
 * <code>Object</code>.  The result is <code>true</code> if and only if
 * the argument is a <code>Calendar</code> object of the same calendar
 * system that represents the same time value (millisecond offset from the
 * <a href="#Epoch">Epoch</a>) under the same
 * <code>Calendar</code> parameters as this object.
 *
 * <p>The <code>Calendar</code> parameters are the values represented
 * by the <code>isLenient</code>, <code>getFirstDayOfWeek</code>,
 * <code>getMinimalDaysInFirstWeek</code> and <code>getTimeZone</code>
 * methods. If there is any difference in those parameters
 * between the two <code>Calendar</code>s, this method returns
 * <code>false</code>.
 *
 * <p>Use the {@link #compareTo(Calendar) compareTo} method to
 * compare only the time values.
您最好使用:

if (date.getTime().equals(date1.getTime()))
{
  ...
}
。。。比较返回的
Date
对象,或者按照Javadoc的建议,使用
compareTo()


我知道你在做练习,但你应该知道:

(a) 避免使用java.util.Calendar

与java捆绑在一起的java.util.Date和.Calendar类是出了名的麻烦。避开它们。可以使用与Java8捆绑的新版本,也可以使用启发了Java.time的库。time和Joda time都有各自的优点和缺点,都是活动项目,您甚至可以在项目中使用它们

(b) 仅日期

旧的.Date和.Calendar类只缺少日期的表示,而没有一天中的时间。但这正是你的问题所要求的,一个只有日期,没有时区的课程。幸运的是,Joda Time和java.Time都有这样一个类,都被称为

(c) 半开

处理时间跨度的最佳方法称为“半开放”,其中开始是包含的,结束是独占的。例如,6月份是6月1日,一直到但不包括7月1日。这简化了无论是只做日期工作还是日期时间工作。Joda Time和java.Time采用这种方法

这似乎是正确的,一天中的时间部分是甩你了

下面是Joda Time2.4中的一些示例代码,可以帮助您朝着正确的方向前进

LocalDate target = new LocalDate( 2008, 12, 20 );

LocalDate highSummerStart = new LocalDate( 2008, 6, 1 );  // Half-Open. Inclusive.
LocalDate highSummerStop = new LocalDate( 2008, 7, 1 );  // Exclusive.

LocalDate lateSummerStart = new LocalDate( 2008, 7, 1 );  // Half-Open. Inclusive.
LocalDate lateSummerStop = new LocalDate( 2008, 8, 1 );  // Exclusive.

LocalDate holidaysStart = new LocalDate( 2008, 11, 20 );  // Half-Open. Inclusive.
LocalDate holidaysStop = new LocalDate( 2009, 1, 2 );  // Exclusive.

if ( this.rangeContainsTarget( highSummerStart, highSummerStop, target ) ) {
    System.out.println( "Apply High Summer rates." );
} else if ( this.rangeContainsTarget( lateSummerStart, lateSummerStop, target ) ) {
    System.out.println( "Apply Late Summer rates." );
} else if ( this.rangeContainsTarget( holidaysStart, holidaysStop, target ) ) {
    System.out.println( "Apply Holidays rates." );
} else { // Else not in special season.
    System.out.println( "Apply default rates." );
}
比较法

private boolean rangeContainsTarget( LocalDate start, LocalDate stop, LocalDate target )
{
    // Half-Open approach. If the Target is GREATER THAN OR EQUAL TO Start AND Target is LESS THAN Stop.
    if ( start.isAfter( stop ) ) {
        return false; // Or throw exception.
    }
    boolean startGood = ( target.isEqual( start ) || target.isAfter( start ) );
    boolean stopGood = target.isBefore( stop );
    boolean containsTarget = ( startGood && stopGood );
    return containsTarget;
}

旧的.Date/.Calendar类缺少表示时间跨度的方法。Joda Time提供了三个类来以各种方式定义时间跨度:Interval、Period和Duration。不幸的是,它们只处理DateTime,而不是LocalDate。所以我没有在上面的示例中使用它们,因为在这个示例中,Interval很方便



顺便说一句,如果在Joda Time中,您确实需要一个日期加上一天中的某个时间,但又想专注于几天,请调用
withTimeAtStartOfDay()
方法将DateTime对象设置为一天中的第一个时刻。第一个时刻并不总是00:00:00.000,因为夏令时和其他可能的异常情况。

您使用的是什么版本的Java?我使用的是Java版本7。这很公平。我想指出,Java8有一个更好的日期和时间API。如果您愿意使用第三方,请看,这就是Java8One的基础。旧的JDK时间类很难使用。
处理时间跨度的最佳方法
。。。这是你的观点,你可以用任何方式处理时间跨度,不管是排他性的还是非排他性的,开始,结束。。。这里没有最好的方法,一切都在需求中。谢谢!我会珍惜你和乔达的时间!
if (date.compareTo(date1) == 0)
{
  ...
}
LocalDate target = new LocalDate( 2008, 12, 20 );

LocalDate highSummerStart = new LocalDate( 2008, 6, 1 );  // Half-Open. Inclusive.
LocalDate highSummerStop = new LocalDate( 2008, 7, 1 );  // Exclusive.

LocalDate lateSummerStart = new LocalDate( 2008, 7, 1 );  // Half-Open. Inclusive.
LocalDate lateSummerStop = new LocalDate( 2008, 8, 1 );  // Exclusive.

LocalDate holidaysStart = new LocalDate( 2008, 11, 20 );  // Half-Open. Inclusive.
LocalDate holidaysStop = new LocalDate( 2009, 1, 2 );  // Exclusive.

if ( this.rangeContainsTarget( highSummerStart, highSummerStop, target ) ) {
    System.out.println( "Apply High Summer rates." );
} else if ( this.rangeContainsTarget( lateSummerStart, lateSummerStop, target ) ) {
    System.out.println( "Apply Late Summer rates." );
} else if ( this.rangeContainsTarget( holidaysStart, holidaysStop, target ) ) {
    System.out.println( "Apply Holidays rates." );
} else { // Else not in special season.
    System.out.println( "Apply default rates." );
}
private boolean rangeContainsTarget( LocalDate start, LocalDate stop, LocalDate target )
{
    // Half-Open approach. If the Target is GREATER THAN OR EQUAL TO Start AND Target is LESS THAN Stop.
    if ( start.isAfter( stop ) ) {
        return false; // Or throw exception.
    }
    boolean startGood = ( target.isEqual( start ) || target.isAfter( start ) );
    boolean stopGood = target.isBefore( stop );
    boolean containsTarget = ( startGood && stopGood );
    return containsTarget;
}