Java 以31天为单位检测月份

Java 以31天为单位检测月份,java,if-statement,Java,If Statement,是否存在以下代码的类似形式: if(month == 4,6,9,11) { do something; } 或者必须是: if(month == 4 || month == 6 etc...) { do something; } 我试图写一个if语句,检查这个月是否超过31天 编辑 我想真正的问题是我理解了一些我学到的东西,但每次我试图使用sun网站了解java时,我都会感到困惑。我的问题是,如果我从一个用户那里得到一个月和一天,并将其转换为MM/dd格式,然后对其进行评估,那么是

是否存在以下代码的类似形式:

if(month == 4,6,9,11)
{
  do something;
}
或者必须是:

if(month == 4 || month == 6 etc...)
{
  do something;
}
我试图写一个
if
语句,检查这个月是否超过31天

编辑


我想真正的问题是我理解了一些我学到的东西,但每次我试图使用sun网站了解java时,我都会感到困惑。我的问题是,如果我从一个用户那里得到一个月和一天,并将其转换为MM/dd格式,然后对其进行评估,那么是否有一种更简单的方法来检查该月和该天是否有效,在我检查其有效性后,我可以以我拥有的格式打印MM/dd。如果无效,请打印一行,上面写着无效的月份或日期。

您不指定语言,但如果您使用Java,那么是的,您必须使用第二种方法,或者使用开关:

switch(month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
}
或者,您可能会发现,不硬编码值,而是将其保存在其他位置,这非常有用且更简洁(取决于设计):

private static final Collection<Integer> MONTHS_TO_RUN_REPORT = Arrays.asList(4, 6, 9, 11);
....
if (MONTHS_TO_RUN_REPORT.contains(month)) {
  do something;
}   
private static final Collection MONTHS\u TO\u RUN\u REPORT=Arrays.asList(4,6,9,11);
....
if(月到运行报告包含(月)){
做点什么;
}   

如果您使用的是C或Java,则可以执行以下操作:

switch (month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
    break;
}
public static class Extensions 
{
 public static bool IsIn(this Int32 intVal, params Int32[] vals)
 {
   return vals.Any(i => i == intVal)
 }
}

int month = 4;
if (month.IsIn(4,6,9,11)) {
//do something
}
在某些语言中,您甚至可以编写
案例4,6,9,11:
。 其他的可能性是创建一个数组[4,6,9,11],一些函数式语言应该允许像
这样的东西,如果[4,6,9,11]中的month做了一些事情

正如莱奥所说,这取决于语言

编辑:顺便说一下,您也可以这样做(只是为了好玩,因为不可读,所以代码不好):


对于几乎所有的语言,您都需要使用第二个选项,但在大多数语言中,您可以编写类似于

if [4,6,9,11].map{|day|==month}.inject(false){|all, elem| all|elem}
    do thing
或者更好

if month in [4,6,9,11]:
    do thing
如果您使用C#,或许可以这样做:

switch (month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
    break;
}
public static class Extensions 
{
 public static bool IsIn(this Int32 intVal, params Int32[] vals)
 {
   return vals.Any(i => i == intVal)
 }
}

int month = 4;
if (month.IsIn(4,6,9,11)) {
//do something
}

不要做任何特定的检查。尝试并转换为有效日期-如果引发异常,请报告无效日期。毕竟,如果月份是2月,您还需要检查日期是否大于28(或者是29?)。

直接翻译成Java是:

if (Arrays.binarySearch(new int[] { 4, 6, 9, 11 }, month) >= 0) {
我不知道4、6、9和11有什么特别之处。您最好使用一个枚举,以及
EnumSet
或者枚举上的一个方法。OTOH,也许JodaTime做了一些有用的事情。

if(0x0A50&(1C)35;因为我不懂Java:

if( 0x0A50 & (1<<month) != 0 )
int[]DaysInMonth=新的int[]{31,28,31,30,31,30,30,31,31,30,31}

如果(DaysInMonth[月]==31)

忘记许多人提倡的奇特逻辑吧——这种方法更清晰,更容易调试

但是,要回答您在邮件中实际提出的问题:

如果(错误)

因为没有超过31天的月份


编辑:是的,我没有提到闰年。那必须单独处理。问题是这个月是否有31天,虽然我的答案是肯定的。我可以用一系列布尔值来完成,但既然数组需要在那里,为什么不把长度加进去呢?

我认为如果你使用我们,你的代码会更加自我记录e日历中内置的静态常数(如日历、一月等)

如果您经常这样做(不止一次),我建议您编写一个名为has31Days()或isReportMonth()的方法,在一个位置执行检查

更新:

重要的不是有31天的月份,而是业务规则告诉你这些月份的报告

我可能会这样写(希望我有31天的正确月份):

公共类报表引擎
{
公共布尔值isReportRequired(整数月)
{
如果((月<日历1月)| |(月>日历12月))
抛出新的IllegalArgumentException(“无效月份:+月份”);
//报告需在31天内提交数月。
返回((月==日历1月)|
(月=日历三月)|
(月==日历。五月)||
(月=日历7月)|
(月=日历8月)|
(月==日历10月)||
(月==日历12月));
}
}
本月

System.out.println("This month has " + new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH) + " days in it.");
检查本月是否有31天的if报表

if (31 == new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH))
{
    System.out.println("31 days on this month");
}
else
{
    System.out.println("Not 31 days in this month");
}
写下所有月份的天数

Calendar cal = new GregorianCalendar();
for (int i = 0; i < 12; i++)
{
    cal.set(2009, i, 1); //note that the month in Calendar goes from 0-11
    int humanMonthNumber = i + 1;
    int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    System.out.println("The " + humanMonthNumber + ". month has " + max  + " days.");
}

关于日期和Java的任何问题都不必提及

for(int i=DateTimeConstants.JANUARY;i用于我前面提到的日期,但我理解它是否不适用于您。
如果您只是想让它看起来好看,您可以首先定义一个包含您感兴趣的值的列表,然后检查您的月份是否在该列表中:

// This should be a field in a class
// Make it immutable
public static final List<Integer> LONGEST_MONTHS = 
        Collections.immutableList(Arrays.asList(4,6,9,11));

// Somewhere in your code
if(LONGEST_MONTHS.contains(month)) {
    doSomething();
}
//这应该是类中的字段
//使它不可改变
公共静态最终列表最长\u个月=
集合.immutableList(Arrays.asList(4,6,9,11));
//在代码中的某个地方
if(最长月数(月)){
doSomething();
}
在图标中,您可以执行以下操作

if month = (4|6|9|11) then ...
你也可以

if a < b < c then ...
如果a
另见
Simpe Aux函数(C#),它提供给定月份的天数:

    private int GetDaysInMonth(DateTime date)
    {
        return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1).Day;
    }

希望它能帮助你检查一个月是否超过31天,最简单的编写方法是(Java):


我是唯一能想到的人吗

month_has_31days = month % 2 == month < 8
月份\u有\u 31天=月份%2==月份<8

至少在C语言中,现在不能检查java

移动到下个月的第一天并减去一天

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);

一个完整的解决方案,也考虑了闰年

private static int getDaysInMonth(LocalDateTime localDateTime) {

    int daysInMonth = 0;
    int year = localDateTime.getYear();
    int month = localDateTime.getMonth().getValue();

    switch (month) {
        case 1: case 3: case 5:
        case 7: case 8: case 10:
        case 12:
            daysInMonth = 31;
            break;
        case 4: case 6:
        case 9:case 11:
            daysInMonth = 30;
            break;
        case 2:
            if(((year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0))) {
                daysInMonth = 29;
            } else {
                daysInMonth = 28;
            }
            break;
        default: System.out.println("Invalid month");
            break;
    }

    return daysInMonth;
}
太长,读不下去了 java.time 现代方法使用java.time类来取代麻烦的旧日期时间类

枚举为一年中的每个月定义一个对象

EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
    if( month.maxLength() == 31 ) {
        thirtyOneDayMonths.add( month ) ;
    }
}
或者你也可以


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅.和搜索堆栈溢出的许多示例
Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
private static int getDaysInMonth(LocalDateTime localDateTime) {

    int daysInMonth = 0;
    int year = localDateTime.getYear();
    int month = localDateTime.getMonth().getValue();

    switch (month) {
        case 1: case 3: case 5:
        case 7: case 8: case 10:
        case 12:
            daysInMonth = 31;
            break;
        case 4: case 6:
        case 9:case 11:
            daysInMonth = 30;
            break;
        case 2:
            if(((year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0))) {
                daysInMonth = 29;
            } else {
                daysInMonth = 28;
            }
            break;
        default: System.out.println("Invalid month");
            break;
    }

    return daysInMonth;
}
EnumSet.of( Month.JANUARY , Month.MARCH , Month.MAY , Month.JULY , Month.AUGUST , Month.OCTOBER , Month.DECEMBER )
       .contains( Month.from( LocalDate.now() ) )
EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
    if( month.maxLength() == 31 ) {
        thirtyOneDayMonths.add( month ) ;
    }
}
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Month currentMonth = Month.from( today ) ;
if( thirtyOneDayMonths.contains( currentMonth ) ) {
    …
}
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .lengthOfMonth()