문제

다음 코드와 유사한 형식이 있습니까?

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

아니면 다음과 같아야 합니다:

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

나는 글을 쓰려고 노력하고있다 if 이번 달이 31일 이상인지 확인하는 문입니다.

편집하다

진짜 문제는 제가 배운 내용 중 일부를 이해하지 못하고 있다는 것입니다. 하지만 Java에 관한 Sun 웹사이트를 사용하려고 할 때마다 혼란스럽습니다.내 질문은 사용자와 날짜로부터 한 달을 받아 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) != 0 )

야, 이건 말도 안 돼요. (month==4||month==6||month==9||month==11) 완벽하게 괜찮습니다.

언어를 지정하지 않지만 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;
}   

이번 달

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.

자바로의 문자 그대로의 번역은 다음과 같습니다.

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

4, 6, 9 및 11에 대해 특별한 것이 무엇인지 모르겠습니다. EnumSet 또는 아마도 열거적인 방법 일 수도 있습니다. Otoh, 아마도 Jodatime은 유용한 것을 할 수 있습니다.

캘린더에 내장 된 정적 상수를 사용하면 코드가 더 자체적으로 문서화 될 것이라고 생각합니다 (예 : Calendar. 1 월 등).

이 작업을 종종 한 번 이상 수행하는 경우 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) ...

몇 달이 없으므로 31 일 이상!

편집 : 예, 윤년을 다루지 않았습니다. 그것은 별도로 처리해야합니다. 문제는 그 달에 31 일이 있었는지 여부였습니다. 하다 대답. 나는 부울 배열로 그것을 할 수 있었지만 어쨌든 배열이 있어야하기 때문에 길이를 넣지 않겠습니까?

내가 사용하는 날짜 조다 시간 앞서 언급했지만, 그것이 당신에게 적용 할 수 없는지 이해합니다. 멋지게 보이기를 원한다면 먼저 관심있는 값이있는 목록을 정의한 다음 그 월에 해당 목록에 있는지 확인할 수 있습니다.

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

날짜와 자바에 대한 의문은 언급하지 않고 완성 될 것입니다. 조다 시간.

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 월 -11 일
2 월 -29 일
3 월 -11
4 월 -30 일
5 월 -11
6 월 -30 일
7 월 -11 일
8 월 -11 일
9 월 -30 일
10 월 -11 일
11 월 -30 일
12 월 -11 일

주어진 달의 일을 제공하는 Simpe Aux 함수 (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; dr

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

아니면 그냥 할 수 있습니다 오늘 날짜를 심문하십시오.

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

Java.Time에 대해

그만큼 Java.Time 프레임 워크는 Java 8 이상에 내장되어 있습니다. 이 수업은 번거로운 오래된 것을 대체합니다 유산 다음과 같은 날짜 시간 수업 java.util.Date, Calendar, & SimpleDateFormat.

그만큼 조다-시간 지금 프로젝트 유지 관리 모드, Java.Time 클래스.

자세한 내용은 오라클 튜토리얼. 많은 예와 설명에 대한 검색 스택 오버 플로우. 사양입니다 JSR 310.

Java.Time 수업을 어디에서 얻을 수 있습니까?

그만큼 Threeten-extra 프로젝트는 추가 클래스로 Java.Time을 연장합니다. 이 프로젝트는 Java.Time에 향후 추가 할 수있는 근거입니다. 여기에서 유용한 수업을 찾을 수 있습니다 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