是否有一个类似形式的下列代码:

if(month == 4,6,9,11)
{
  do something;
}

或者,它必须是:

if(month == 4 || month == 6 etc...)
{
  do something;
}

我想写一个 if 声明,检查,如果这个月已经超过31天。

编辑

我想真正的问题是我undersand一些我的教导,但是每次我尝试使用太阳网站关于java它只是混淆了我。我的问题是如果我得到一个月,在从用户和天,我把它变成一个毫米/dd格式和进行评估,然后是有一个更简单的方法,以检查是否月和天是有效和后我检查它是有效的我可以打印的MM/dd的格式,我有。如果不是有效的打印的一条线说,无效的一个月或一天。

有帮助吗?

解决方案

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

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

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

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

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

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

其他提示

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

你没有指定语言,但如果你使用的是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;
}   

本月

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.

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

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

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

如果您使用日历中内置的静态常量(例如,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));
    }
}

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

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

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

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完成它但是因为数组需要在那里为什么不把长度放进去?

对于日期我使用前面提到的 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();
}

如果没有提及 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日

Simpe辅助功能(C#),它可以为您提供给定月份的天数:

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

希望有所帮助

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

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#,您可以这样做:

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
}

在图标,那么可以做的

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

你也可以做

if a < b < c then ...

也参看

我是唯一一个想出

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

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

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

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

tl博士

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

java。时间

现代方法使用java。时间的课程,取而代之的麻烦的旧日时的课程。

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 ) ) {
    …
}

或者你可以只是 审讯今天的日期.

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

关于java。时间

java。时间 框架是建立成Java8和后。这些类别取代的麻烦老 遗产 日间课程,例如 java.util.Date, Calendar, & SimpleDateFormat.

乔达时 项目,现在 维护模式, 建议迁移到 java。时间 课程。

若要了解更多信息,请参见的 Oracle教程.和搜索堆溢出许多实例和解释。说明书 JSR310.

在那里获得java。时间上课?

ThreeTen-额外的 项目的延伸java。时与附加课程。这个项目是一个试验场于今后可能增加java。时间。你可以找一些有用的类在这里 Interval, YearWeek, YearQuarter, , 更多.

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

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top