检测31天的月份

时间:2009-11-27 00:00:29

标签: 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格式并进行评估,那么有更简单的方法来检查月份和日期是否有效以及我检查之后有效我可以打印我的格式的MM / DD。如果无效打印一行显示无效的月份或日期。

19 个答案:

答案 0 :(得分:27)

if( 0x0A50 & (1<<month) != 0 )
老兄,这太荒谬了。 (month==4||month==6||month==9||month==11)完全可以。

答案 1 :(得分:12)

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

switch (month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
    break;
}

在某些语言中,您甚至可以编写case 4,6,9,11:。 其他可能性是创建一个数组[4,6,9,11],一些函数式语言应该允许像if month in [4,6,9,11] do something;这样的东西

正如Lior所说,这取决于语言。

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

if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something;

答案 2 :(得分:7)

你没有指定语言,但如果你使用的是Java,那么你可以采用第二种方式,或者使用switch:

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;
}   

答案 3 :(得分:6)

本月

System.out.println("This month has " + new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH) + " days in it.");

如果声明要检查本月是否有31天

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.");
}

输出:

This month has 30 days in it.
Not 31 days in this month
The 1. month has 31 days.
The 2. month has 28 days.
The 3. month has 31 days.
The 4. month has 30 days.
The 5. month has 31 days.
The 6. month has 30 days.
The 7. month has 31 days.
The 8. month has 31 days.
The 9. month has 30 days.
The 10. month has 31 days.
The 11. month has 30 days.
The 12. month has 31 days.

答案 4 :(得分:5)

Java的一个相当字面的翻译将是:

if (Arrays.binarySearch(new int[] { 4, 6, 9, 11 }, month) >= 0) {

我不知道4,6,9和11有什么特别之处。你可能最好使用枚举,EnumSet或枚举方法。 OTOH,也许JodaTime做了一些有用的事情。

答案 5 :(得分:4)

如果您使用日历中内置的静态常量(例如,Calendar.JANUARY等),我认为您的代码将更加自我记录。

如果你经常这样做 - 不止一次 - 我建议你写一个名为has31Days()或isReportMonth()的方法在一个地方进行检查。

更新:

重要的不是有31天的月份 - 业务规则会告诉你这几个月的报告。

我可能会这样写(希望我能在31天内完成这几个月):

public class ReportEngine
{
    public boolean isReportRequired(int month)
    {
        if ((month < Calendar.JANUARY) || (month > Calendar.DECEMBER))
            throw new IllegalArgumentException("Invalid month: " + month);

        // Reports are required for months with 31 days.
        return ((month == Calendar.JANUARY) || 
                (month == Calendar.MARCH) || 
                (month == Calendar.MAY) ||
                (month == Calendar.JULY) || 
                (month == Calendar.AUGUST) || 
                (month == Calendar.OCTOBER) ||
                (month == Calendar.DECEMBER));
    }
}

答案 6 :(得分:3)

如果您正在检查一个月是否超过31天,那么编写它的最简单方法是(在Java中):

 public static boolean hasMoreThan31Days(final int month) {
    return false;
   } 

答案 7 :(得分:2)

不要做任何具体检查。尝试转换为有效日期 - 如果它抛出异常,则报告无效日期。毕竟,如果月份是2月,您还需要检查大于28天(或者是29?)。

答案 8 :(得分:2)

C#因为我不懂Java:

int [] DaysInMonth = new int [] {31,28,31,30,31,30,31,31,30,31,30,31}

if(DaysInMonth [month] == 31)...

忘记许多人所倡导的奇特逻辑 - 这种方式更清晰,更容易调试。

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

if(false)...

因为 MORE 没有月份超过31天!

编辑:是的,我没有解决闰年问题。这必须单独处理。问题是这个月是否有31天 - 我的 DOES 回答。我本可以用一系列bool完成它但是因为数组需要在那里为什么不把长度放进去?

答案 9 :(得分:1)

如果不提及Joda Time,日期和Java就不会有问题。

for(int i = DateTimeConstants.JANUARY; i <= DateTimeConstants.DECEMBER; i++) {
    LocalDate localDate = new LocalDate().withMonthOfYear(i);
    System.out.println("    " +localDate.toString("MMMM") + " - " + localDate.dayOfMonth().getMaximumValue());
}
  1月 - 31日   2月29日   3月 - 31日   4月30日   5月 - 31日   6月30日   7月 - 31日   8月 - 31日   9月30日   10月 - 31日   11月30日   12月31日

答案 10 :(得分:1)

对于我使用前面提到的Joda Time的日期,但我了解它是否适​​合您。 如果您只是希望它看起来不错,您可以先定义一个包含您感兴趣的值的列表,然后检查您的月份是否在该列表中:

// 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();
}

答案 11 :(得分:1)

答案 12 :(得分:0)

也许如果您使用C#,您可以这样做:

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
}

答案 13 :(得分:0)

几乎任何你需要使用第二个选项,但在大多数语言中你可以写类似的东西

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

答案 14 :(得分:0)

在Icon中,你可以做到

if month = (4|6|9|11) then ...

您也可以

if a < b < c then ...

另见

答案 15 :(得分:0)

我是唯一一个想出

的人
month_has_31days = month % 2 == month < 8

至少在C中,现在无法检查java

答案 16 :(得分:0)

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

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;
}

答案 17 :(得分:0)

TL;博士

EnumSet.of( Month.JANUARY , Month.MARCH , Month.MAY , Month.JULY , Month.AUGUST , Month.OCTOBER , Month.DECEMBER )
       .contains( Month.from( LocalDate.now() ) )

java.time

现代方法使用java.time类来取代麻烦的旧日期时间类。

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

EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
    if( month.maxLength() == 31 ) {
        thirtyOneDayMonths.add( month ) ;
    }
}

查看当月是否在31天的月份集合中。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Month currentMonth = Month.from( today ) ;
if( thirtyOneDayMonths.contains( currentMonth ) ) {
    …
}

或者你可以interrogate today's date

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .lengthOfMonth()

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 18 :(得分:-1)

移至下个月的第一天并减去一天。

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