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()