检测31天的月份

是否有以下代码的类似forms:

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

或者必须是:

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

我正在尝试写一个if语句来检查这个月是否超过31天。

编辑

我想真正的问题是我和我所教的一些东西,但每次我尝试使用sun网站关于java时它只会让我感到困惑。 我的问题是,如果我从一个用户和一天获得一个月的时间,我将其放入MM / 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],一些函数式语言应该允许像if month in [4,6,9,11] do something;

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

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

 if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something; 
 if( 0x0A50 & (1< 

老兄,这太荒谬了。 (month==4||month==6||month==9||month==11)完全可以。

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

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

或者,您可能会发现它有用且更干净(取决于设计),不对代码值进行硬编码,而是将它们保存在别处:

 private static final Collection 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."); 

if语句检查本月是否有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) { 

我不知道EnumSet和11有什么特别之处。你可能最好使用枚举, EnumSet或enum上的方法。 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; } 

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

C#因为我不知道Java:

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

if(DaysInMonth [month] == 31)…

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

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

如果(假)……

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

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

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

 // This should be a field in a class // Make it immutable public static final List 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辅助function(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 } 

在Icon中,你可以做到

 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.time

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

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

 EnumSet 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.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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

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

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