Java中int个月的间隔

时间:2016-12-27 12:32:41

标签: java datetime calendar

我有两个int个变量monthFrommonthUntil代表一个区间。我想写一个方法,可以找出冬季月份是否与这个区间重叠。例如,如果monthFrom == 3monthUntil == 5,则方法将返回false,如果monthFrom == 2monthUntil == 8 - true,则{{1} },monthFrom == 10 - monthUntil= = 3,等等。

作为Java的初学者,我不知道该怎么做。有什么帮助吗?

5 个答案:

答案 0 :(得分:2)

Joe我的代码可以帮助您解决问题。 我使用HashMap Collection来存储月份的值,因为它包含对应于值的固定月份数,即月份名称。

在下面找到我的代码

public class FindWinterMonth {
HashMap<Integer, String> months = null;
public FindWinterMonth() {
    months = new HashMap<Integer, String>();
    months.put(10, "October");
    months.put(11, "November");
    months.put(12, "December");
    months.put(1, "January");
    months.put(2, "Febuary");
}

public boolean isWinterMonth(int monthFrom, int monthUntil){
    boolean isPresent = false;
    for(int i = monthFrom; i <= monthUntil; i++){
        if(months.containsKey(i)){
            isPresent = true;
        }
    }
    return isPresent;
}

public static void main(String[] args) {
    FindWinterMonth fm = new FindWinterMonth();
    boolean isWinter = fm.isWinterMonth(4,9);
    System.out.println(isWinter);
}

}

我相信它可以帮助您,如果有人有好的和有效的解决方案与我们分享。 谢谢!

答案 1 :(得分:0)

您可以使用以下代码:

if (monthFrom <= monthUntil && monthUntil != 12 && monthFrom >= 3)
    return false;
else
    return true;

或者您可以像这样简化此代码:

return !(monthFrom <= monthUntil && monthUntil != 12 && monthFrom >= 3);

答案 2 :(得分:0)

根据提供的规则,给定的代码应该产生所需的输出:

public static void main(String[] args){
    isWinter(3,5);
    isWinter(2,8);
    isWinter(10,3);
}

public static void isWinter(int monthFrom, int monthUntil) {
    if(monthFrom <= monthUntil && monthFrom  <  3 || 
       monthFrom >  monthUntil && monthUntil <= 3) {
        System.out.println("Winter time");
    } else {
        System.out.println("Not winter time");
    }
}

O / P

Not winter time
Winter time
Winter time

monthUntil <= 3 monthFrom > monthUntilmonthFrom < 3 monthFrom < monthUntilisWinter(3,5);时,该检查适用冬季规则。

由于没有明确的定义,我认为false必须返回isWinter(10,3);true的规则必须返回import pexpect cmd = "ssh -o StrictHostKeyChecking=no %s -l %s" % (<host>, <user>) exp = pexpect.spawn(cmd, timeout=7) idx = exp.expect('assword:') nc = exp.sendline(<passwd>) idx = exp.expect('[\n\r](#|\$) ') if idx == 0: before = exp.before print before

答案 3 :(得分:0)

我知道你是一名Java初学者,你现在想要掌握基础知识。这是件好事,我鼓励你继续。

尽管如此,你应该避免在更高级的程序中弄乱基本级别的时间相关代码。时间是一个微妙的话题,几代程序员花费了数小时和数周的时间来使其在Java中易于管理。如果您已经使用Java 8,则包java.time中有一个复杂的日期时间API。

此外,您可能需要检查项目Interval中的ThreeTen-Extra。它提供了计算间隔之间重叠的方法。

答案 4 :(得分:0)

使用对象,而不是数字

最好使用对象而不仅仅是整数。这使您的代码更加自我记录,确保有效值,并提供类型安全。

Month

几个月来,Java提供了Month类。作为Enum,该类预先定义了十几个对象,每月一个,1月到12月为1-12。

EnumSet

EnumSetSet的特殊实现,已针对保存枚举对象进行了优化。 EnumSet对象碰巧执行起来非常快,内存非常小。用它来将“冬天”定义为一组月份。

Set<Month> winter = EnumSet.of ( Month.DECEMBER , Month.JANUARY , Month.FEBRUARY );

至于您的月份范围,请将其定义为EnumSet。实例化很容易,因为类提供了range方法。

//Set<Month> range = EnumSet.range ( Month.of ( 3 ) , Month.of ( 5 ) );
Set<Month> range = EnumSet.range ( Month.of ( 2 ) , Month.of ( 8 ) );

比较集

接下来,我们需要知道range集中的任何元素是否都在winter集中。不幸的是,containsAny界面中没有Set种方法。我们可以通过更多代码获取该行为,创建winter的副本,然后调用removeAll以删除range中包含的所有匹配元素,最后与原始{{1}进行比较}}

winter

或者,创建一组共同的冬季月份并询问该集合是否为非空。

Set<Month> winterMonthsNotInRange = EnumSet.copyOf ( winter );
winterMonthsNotInRange.removeAll ( range );

Boolean rangeContainsWinterMonths = (  ! winter.equals ( winterMonthsNotInRange ) ); // If different, the range contained one or more winter months.

转储到控制台。

Set<Month> winterMonthsInRange = EnumSet.copyOf ( winter );
winterMonthsInRange.removeAll ( winterMonthsNotInRange );

Boolean rangeContainsWinterMonths = (  winterMonthsInRange.size() > 0 ); 
System.out.println ( "winter: " + winter );
System.out.println ( "range: " + range );
System.out.println ( "winterMonthsNotInRange: " + winterMonthsNotInRange );
System.out.println ( "rangeContainsWinterMonths: " + rangeContainsWinterMonths );
System.out.println ( "winterMonthsInRange: " + winterMonthsInRange );

请参阅live code in IdeOne.com

关于winter: [JANUARY, FEBRUARY, DECEMBER] range: [FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST] winterMonthsNotInRange: [JANUARY, DECEMBER] rangeContainsWinterMonths: true winterMonthsInRange: [FEBRUARY]

请记住,这些不是仅仅是正在使用的字符串。 Month个对象是真实的OOP对象,其中包含数据和方法。您在上面的输出中看到的全大写名称是由Enum::toString方法生成的String对象。您也可以通过Month::getDisplayName方法生成自动本地化为其他语言的字符串,例如1月份的法语Month

如果不熟悉Java枚举工具,请研究Oracle Tutorial。它们比其他语言的枚举更强大,但非常易于使用且非常方便。

请记住,您可以在代码周围传递这些janvier个对象和Month / EnumSet个对象。尽量减少使用纯粹整数表示月份的位置。

提示:

  • 您可能还会发现YearMonthMonthDay类很有用。
  • 在序列化为文本时,请注意标准的ISO 8601格式化字符串。