두 날짜 사이의 월 차이


334

C #에서 두 날짜 사이의 월 차이를 계산하는 방법은 무엇입니까?

DateDiff()C # 에 VB의 방법 이 있습니까? 몇 년 떨어진 두 날짜 사이의 월 차이를 찾아야합니다. 설명서에는 TimeSpan다음과 같이 사용할 수 있다고 나와 있습니다 .

TimeSpan ts = date1 - date2;

그러나 이것은 나에게 데이터를 제공합니다. 매월 30 일이 아니기 때문에이 숫자를 30으로 나누고 싶지 않습니다. 두 피연산자 값이 서로 상당히 떨어져 있기 때문에 30을 나누면 잘못된 값을 줄 수 있습니다.

어떤 제안?


27
"달의 차이"를 정의하십시오. "2010 년 5 월 1 일"과 "2010 년 6 월 16 일"의 달 차이는 무엇입니까? 1.5, 1 또는 다른 것?
Cheng Chen

7
또는이 점을 더욱 강조하기 위해 2010 년 12 월 31 일과 2011 년 1 월 1 일 사이의 월 차이는 무엇입니까? 낮에 따라 이것은 1 초의 차이 일 수 있습니다. 이것을 한 달의 차이로 계산 하시겠습니까?
stakx-더 이상

여기에 간단하고 짧은 코드가 있습니다. 그래도 대답을 얻을 수 없었습니다.이 POST를 참조하십시오 stackoverflow.com/questions/8820603/…
wirol

11
대니 : 1 개월 15 일 stakx : 0 개월 1 일. 요점은 구성 요소 를 얻는 것 입니다. 이것은 나에게 명백한 것처럼 보이고 좋은 질문입니다.
Kirk Woll

답변:


462

달의 날짜가 관련이 없다고 가정하면 (예 : 2011.1.1과 2010.12.31 사이의 차이는 1), date1> date2는 양수 값을, date2> date1은 음수 값을 갖습니다.

((date1.Year - date2.Year) * 12) + date1.Month - date2.Month

또는 두 날짜 사이에 '평균 월'의 대략적인 수를 원한다고 가정하면 다음은 매우 큰 날짜 차이에 대해 작동합니다.

date1.Subtract(date2).Days / (365.25 / 12)

후자의 솔루션을 사용하는 경우 단위 테스트는 애플리케이션이 작동하도록 설계된 가장 넓은 날짜 범위를 명시하고 그에 따라 계산 결과를 검증해야합니다.


업데이트 ( Gary 덕분에 )

'평균 월'방법을 사용하는 경우 '연간 평균 일 수'에 사용할 약간 더 정확한 수는 365.2425 입니다.


3
@Kurru-365/12는 한 달 평균 기간의 대략적인 측정치입니다. 부정확 한 측정입니다. 작은 날짜 범위의 경우이 부정확성을 용인 할 수 있지만 매우 큰 날짜 범위의 경우이 부정확성이 커질 수 있습니다.
Adam Ralph

21
Day 구성 요소를 고려해야한다고 생각합니다. 이와 같은 것 (date1.Year - date2.Year) * 12 + date1.Month - date2.Month + (date1.Day >= date2.Day ? 0 : -1)
DrunkCoder

2
@DrunkCoder 특정 시스템의 요구 사항에 따라 다릅니다. 어떤 경우에는 솔루션이 실제로 최선의 선택 일 수 있습니다. 예를 들어, 두 날짜가 31 일 월, 30 일 월, 2 월 28 일 또는 2 월 29 일인 경우에 발생하는 일을 고려하는 것이 중요합니다. 공식의 결과가 시스템에 필요한 것을 제공한다면 분명히 올바른 선택입니다. 그렇지 않은 경우 다른 것이 필요합니다.
Adam Ralph

6
Adam이 말한 것을 둘째로, 몇 년 동안 Acturaries를위한 코드를 작성했습니다. 일부 계산은 일 수로 나누고 월간 숫자를 얻기 위해 30으로 반올림했습니다 . 때로는 모든 날짜가 매월 1 일에 시작 한다고 가정 하고 그에 따라 전체 월을 계산 합니다. 날짜를 계산할 때 가장 좋은 방법 은 없습니다 . 하지 않는 한 당신은 고객이있는 거 코드를 작성 가능하면 고객 회계사, 체인 업이 다시 밀어하고 명확하게 얻을에 있습니다.
이진 걱정

1
365.2425는 Gregorian Calendar에서 사용하는 날짜보다 약간 더 정확한 일 수입니다. 그러나 DateTime.MaxValue (10000 년 1 월 1 일)에 따르면 약 59 일 차이가 있습니다. 또한 연도의 정의는 관점 en.wikipedia.org/wiki/Year 에 따라 크게 다를 수 있습니다 .
게리

207

다음은 시간 구성 요소와 함께 모든 날짜 구성 요소를 포함한다는 점을 제외하고 DateTimeSpan, 를 반환하는 포괄적 인 솔루션 TimeSpan입니다.

용법:

void Main()
{
    DateTime compareTo = DateTime.Parse("8/13/2010 8:33:21 AM");
    DateTime now = DateTime.Parse("2/9/2012 10:10:11 AM");
    var dateSpan = DateTimeSpan.CompareDates(compareTo, now);
    Console.WriteLine("Years: " + dateSpan.Years);
    Console.WriteLine("Months: " + dateSpan.Months);
    Console.WriteLine("Days: " + dateSpan.Days);
    Console.WriteLine("Hours: " + dateSpan.Hours);
    Console.WriteLine("Minutes: " + dateSpan.Minutes);
    Console.WriteLine("Seconds: " + dateSpan.Seconds);
    Console.WriteLine("Milliseconds: " + dateSpan.Milliseconds);
}

출력 :

년 : 1
개월 : 5
일 : 27
시간 : 1
분 : 36
초 : 50
밀리 초 : 0

편의상 논리를 DateTimeSpan구조체에 집중 시켰지만 원하는 위치로 메소드를 이동할 수 있습니다 CompareDates. 또한 어느 날짜가 다른 날짜보다 먼저 나오는지는 중요하지 않습니다.

public struct DateTimeSpan
{
    public int Years { get; }
    public int Months { get; }
    public int Days { get; }
    public int Hours { get; }
    public int Minutes { get; }
    public int Seconds { get; }
    public int Milliseconds { get; }

    public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
    {
        Years = years;
        Months = months;
        Days = days;
        Hours = hours;
        Minutes = minutes;
        Seconds = seconds;
        Milliseconds = milliseconds;
    }

    enum Phase { Years, Months, Days, Done }

    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
    {
        if (date2 < date1)
        {
            var sub = date1;
            date1 = date2;
            date2 = sub;
        }

        DateTime current = date1;
        int years = 0;
        int months = 0;
        int days = 0;

        Phase phase = Phase.Years;
        DateTimeSpan span = new DateTimeSpan();
        int officialDay = current.Day;

        while (phase != Phase.Done)
        {
            switch (phase)
            {
                case Phase.Years:
                    if (current.AddYears(years + 1) > date2)
                    {
                        phase = Phase.Months;
                        current = current.AddYears(years);
                    }
                    else
                    {
                        years++;
                    }
                    break;
                case Phase.Months:
                    if (current.AddMonths(months + 1) > date2)
                    {
                        phase = Phase.Days;
                        current = current.AddMonths(months);
                        if (current.Day < officialDay && officialDay <= DateTime.DaysInMonth(current.Year, current.Month))
                            current = current.AddDays(officialDay - current.Day);
                    }
                    else
                    {
                        months++;
                    }
                    break;
                case Phase.Days:
                    if (current.AddDays(days + 1) > date2)
                    {
                        current = current.AddDays(days);
                        var timespan = date2 - current;
                        span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
                        phase = Phase.Done;
                    }
                    else
                    {
                        days++;
                    }
                    break;
            }
        }

        return span;
    }
}

2
@KirkWoll 감사합니다. 그러나 왜 DateTimeSpan 34이이 날짜 시차에 대해 일을 반환하는 이유는 실제로 35 timeanddate.com/date/…
Deeptechtons

@ Deeptechtons, 멋진 캐치. 시작 날짜 31와 관련 이 있고 몇 일이 더 적은 달을 "지나가는" 날짜와 관련하여 몇 가지 문제가 있습니다 . 나는 논리를 반전 시켰고 (그것이 초기보다 늦게 또는 그 이후로 진행됨) 현재 날짜를 수정하지 않고 월을 누적하고 (따라서 더 적은 기간으로 몇 개월 사이에 통과) 여전히 이상적인 결과가 무엇인지 확실하지 않습니다. 비교할 때해야한다 10/31/201211/30/2012. 현재 결과는 1월입니다.
커크 울

@KirkWoll 업데이트에 감사드립니다. 어쩌면 몇 가지 테스트가 더 필요합니다. 좋은 직업 :)
Deeptechtons

1
나는 제안 된 답변을 테스트 한 비슷한 질문에 대한 답변을 stackoverflow.com/a/17537472/1737957 에 썼습니다 (대부분의 답변이 작동하지 않음). 이 답변은 작동하지 않는 몇 가지 중 하나입니다 (내 테스트 스위트에 따라). 내 답변에서 github에 연결하십시오.
jwg

@KirkWoll-이 답변은 시작 날짜의 날짜 값이 날짜의 월보다 높거나 소스 날짜가 윤년 인 경우에 적용되지 않습니다. 시도 2020-02-292021-06-29바로, "1Y 4m 0D"는 "1Y 4m 1D"을 반환하지만 값이 있어야합니다 -
Enigmativity

37

넌 할 수있어

if ( date1.AddMonths(x) > date2 )

이것은 너무 간단하고 나에게 완벽하게 작동합니다. 1 개월 말에서 다음 달 말일까지의 날짜를 계산할 때 그것이 의도 한대로 작동하는 것을 보게되어 기뻤습니다. 예를 들어 .. 1-31-2018 + 1 개월 = Feb 28 218
lucky.expert

이것은 더 나은 솔루션 중 하나입니다.
barnacle.m

정말 간단하고 효율적인 솔루션! 가장 좋은 답변이 제안되었습니다.
Cedric Arnould

2
date1 = 2018-10-28이고 date2 = 2018-12-21이면 어떻게됩니까? 정답은 3이지만 정답은 3 개월입니다. 우리가 일을 무시하고 몇 개월 만 세면 따라서이 답변은 정확하지 않습니다.
Tommix

더 논리적은 다음과 같습니다. if ( date1.AddMonths(x).Month == date2.Month )그러면 개월 수로 x + 1을 사용하십시오
Tommix

34

전체 월의 정확한 수를 원하면 다음 달 같은 날에 도달하는 달을 고려할 때 항상 양수 (2000-01-15, 2000-02-14는 0을 반환 함)를 원합니다 (연령 계산과 같은 것).

public static int GetMonthsBetween(DateTime from, DateTime to)
{
    if (from > to) return GetMonthsBetween(to, from);

    var monthDiff = Math.Abs((to.Year * 12 + (to.Month - 1)) - (from.Year * 12 + (from.Month - 1)));

    if (from.AddMonths(monthDiff) > to || to.Day < from.Day)
    {
        return monthDiff - 1;
    }
    else
    {
        return monthDiff;
    }
}

편집 이유 : 이전 코드는 다음과 같은 경우에 올바르지 않습니다.

new { From = new DateTime(1900, 8, 31), To = new DateTime(1901, 8, 30), Result = 11 },

Test cases I used to test the function:

var tests = new[]
{
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1900, 1, 1), Result = 0 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1900, 1, 2), Result = 0 },
    new { From = new DateTime(1900, 1, 2), To = new DateTime(1900, 1, 1), Result = 0 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1900, 2, 1), Result = 1 },
    new { From = new DateTime(1900, 2, 1), To = new DateTime(1900, 1, 1), Result = 1 },
    new { From = new DateTime(1900, 1, 31), To = new DateTime(1900, 2, 1), Result = 0 },
    new { From = new DateTime(1900, 8, 31), To = new DateTime(1900, 9, 30), Result = 0 },
    new { From = new DateTime(1900, 8, 31), To = new DateTime(1900, 10, 1), Result = 1 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1901, 1, 1), Result = 12 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1911, 1, 1), Result = 132 },
    new { From = new DateTime(1900, 8, 31), To = new DateTime(1901, 8, 30), Result = 11 },
};

다른 사람들의 혼란을 피하기 위해이 솔루션이 올바르지 않다고 생각합니다. 테스트 케이스를 사용 : new { From = new DateTime(2015, 12, 31), To = new DateTime(2015, 6, 30), Result = 6 } 결과로 실패합니다 시험은 5입니다
크리스티안 Badila

내가 제안 수정과 빠른 요점 추가 여기
크리스티안 Badila

확실하지 않습니다. 함수는 6을 반환합니다. dotnetfiddle.net/MRZNnC
Guillaume86

테스트 케이스를 손으로 복사했는데 실수가 있습니다. 실패한 사양은 다음과 같아야합니다 new { From = new DateTime(2015, 12, 31), To = new DateTime(2016, 06, 30), Result = 6 }. "버그"는 to.Day < from.Day달이 다른 "달의 날"로 끝날 수 있다는 점을 고려하지 않은 코드에 있습니다. 이 경우 2015 년 12 월 31 일부터 2016 년 6 월 30 일까지 6 개월이 지나고 (6 월은 30 일 이후) 코드는 5를 반환합니다.
Cristian Badila

3
내 의견으로는 예상되는 행동이거나, 적어도 내가 기대하는 행동입니다. 나는 당신이 같은 날 (또는이 경우와 같은 다음 달)에 도달했을 때 완전한 달을 정했습니다.
Guillaume86

22

MSDN을 통해 VB.NET 에서이 방법의 사용법을 확인했으며 사용법이 많이있는 것 같습니다. C #에는 이러한 기본 제공 방법이 없습니다. (좋은 생각은 아니지만) C #에서 VB를 호출 할 수 있습니다.

  1. Microsoft.VisualBasic.dll참조로 프로젝트에 추가
  2. Microsoft.VisualBasic.DateAndTime.DateDiff 코드에서 사용

7
왜 좋은 생각이 아니라고 생각합니까? 직관적으로, 라이브러리는 런타임에 '단지 다른 .NET 라이브러리'라고 생각합니다. 참고로, 나는 악마의 옹호자를 여기에서 뛰고 있는데, 그것이 단지 '잘못된 느낌'(속임수의 종류)이기 때문에 이것을하는 것은 미연하지만, 이것을하지 않는 확실한 기술적 이유가 있는지 궁금합니다.
Adam Ralph

3
@AdamRalph : 전혀하지 않을 이유가 없습니다. 이러한 라이브러리는 100 % 관리 코드로 구현되므로 다른 모든 것과 동일합니다. 유일하게 생각할 수있는 차이점은 Microsoft.VisualBasic.dll모듈을로드해야한다는 점이지만 그렇게하는 데 걸리는 시간은 무시할 만합니다. C #으로 프로그램을 작성하기로 선택한 이유만으로 철저히 테스트되고 유용한 기능을 사용하지 않아도됩니다. (이것도 My.Application.SplashScreen마찬가지입니다.)
Cody Grey

3
C #으로 작성된 것을 알고 있다면 마음이 바뀌겠습니까? 그렇습니다. 같은 논리로 System.Data와 PresentationFramework를 사용하는 것도 상당 부분 C ++ / CLI로 작성되었습니다.
Hans Passant

3
@AdamRalph : 떠오르는 "이상한 수하물"의 특별한 예는? 아니면 순수하게 가정적으로 말하고 있습니까? 그리고 네, 올바른 using진술 로 한 줄로 할 수있는 일을하기 위해 서사시 양의 코드를 작성해온 일부 C # 친구들의 마음에 엉망이 될 수 있지만 심각한 손상이 있을지 의심됩니다.
코디 그레이

1
@Cody Grey : 예를 들자면이 예제는 간단합니다. 피할 수있는 특별한 (C # POV에서) 메소드를 호출하여 소개 된 추가 코드 '노이즈'입니다. 잘 구성된 팀에서는 코드 검토에서 이러한 것들을 포착하여 쉽게 피할 수 있습니다. BTW-VB6 / VB.NET을 공격하려고하지 않습니다. .NET POV에서 속성 이있는 경우 DateAndTime.Year()존재할 이유가 없기 때문에 이러한 방법을 '이상한'이라고 설명 했습니다. VB.NET을 VB6처럼 보이게 만드는 것만 존재합니다. 전 VB6 프로그래머로서 나는 이것을 이해할 수있다 ;-)DateTimeYear
Adam Ralph

10

날짜와 상관없이 월 (시작 및 끝 포함)의 차이를 얻으려면 :

DateTime start = new DateTime(2013, 1, 1);
DateTime end = new DateTime(2014, 2, 1);
var diffMonths = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);

5
상상 start하고 end동일합니다. 그런 다음 1의 결과를 얻습니다. 어떻게됩니까? 왜 결과에 1을 더합니까? 이 답변을 누가 투표합니까? :-/?
paul

동일한 날짜의 경우 출력이 1로 표시됩니다. 기본적으로 시작 월과 종료 월을 포함한 모든 월을 계산합니다.
Chirag

3
나에게 두 항목의 차이점처럼 들리지 않습니다. 2와 2의 차이점은 무엇입니까? 정말 1입니까? 나는 그 차이가 0이라고 제안 할 것이다.
paul


7

예를 들어 월 / 년만 입력되는 고용 날짜를 충족시키기 위해 간단한 것이 필요했기 때문에 별개의 년과 월이 근무하고 싶었습니다. 이것은 내가 여기서 유용하게 사용하는 것입니다.

public static YearsMonths YearMonthDiff(DateTime startDate, DateTime endDate) {
    int monthDiff = ((endDate.Year * 12) + endDate.Month) - ((startDate.Year * 12) + startDate.Month) + 1;
    int years = (int)Math.Floor((decimal) (monthDiff / 12));
    int months = monthDiff % 12;
    return new YearsMonths {
        TotalMonths = monthDiff,
            Years = years,
            Months = months
    };
}

.NET 바이올린


4

.NET 용 Time LibraryDateDiff 클래스를 사용할 수 있습니다 .

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  DateDiff dateDiff = new DateDiff( date1, date2 );

  // differences
  Console.WriteLine( "DateDiff.Months: {0}", dateDiff.Months );
  // > DateDiff.Months: 16

  // elapsed
  Console.WriteLine( "DateDiff.ElapsedMonths: {0}", dateDiff.ElapsedMonths );
  // > DateDiff.ElapsedMonths: 4

  // description
  Console.WriteLine( "DateDiff.GetDescription(6): {0}", dateDiff.GetDescription( 6 ) );
  // > DateDiff.GetDescription(6): 1 Year 4 Months 12 Days 12 Hours 41 Mins 29 Secs
} // DateDiffSample

2

다음은 정확한 것으로 판명 된 달의 차이를 얻는 데 기여한 내용입니다.

namespace System
{
     public static class DateTimeExtensions
     {
         public static Int32 DiffMonths( this DateTime start, DateTime end )
         {
             Int32 months = 0;
             DateTime tmp = start;

             while ( tmp < end )
             {
                 months++;
                 tmp = tmp.AddMonths( 1 );
             }

             return months;
        }
    }
}

용법:

Int32 months = DateTime.Now.DiffMonths( DateTime.Now.AddYears( 5 ) );

DiffYears라는 다른 메소드를 작성하고 while 루프에서 AddMonths 대신 위의 AddYears와 정확히 동일한 논리를 적용 할 수 있습니다.


2

이것은 내가 필요한 것을 위해 일했습니다. 달의 날짜는 항상 달의 마지막 날이기 때문에 제 경우에는 중요하지 않습니다.

public static int MonthDiff(DateTime d1, DateTime d2){
    int retVal = 0;

    if (d1.Month<d2.Month)
    {
        retVal = (d1.Month + 12) - d2.Month;
        retVal += ((d1.Year - 1) - d2.Year)*12;
    }
    else
    {
        retVal = d1.Month - d2.Month;
        retVal += (d1.Year - d2.Year)*12;
    }
    //// Calculate the number of years represented and multiply by 12
    //// Substract the month number from the total
    //// Substract the difference of the second month and 12 from the total
    //retVal = (d1.Year - d2.Year) * 12;
    //retVal = retVal - d1.Month;
    //retVal = retVal - (12 - d2.Month);

    return retVal;
}

2

가장 정확한 방법은 몇 달의 차이를 분수로 반환하는 것입니다.

private double ReturnDiffereceBetweenTwoDatesInMonths(DateTime startDateTime, DateTime endDateTime)
{
    double result = 0;
    double days = 0;
    DateTime currentDateTime = startDateTime;
    while (endDateTime > currentDateTime.AddMonths(1))
    {
        result ++;

        currentDateTime = currentDateTime.AddMonths(1);
    }

    if (endDateTime > currentDateTime)
    {
        days = endDateTime.Subtract(currentDateTime).TotalDays;

    }
    return result + days/endDateTime.GetMonthDays;
}

2

적어도 나를 위해 작동하는 간단한 솔루션이 있습니다. 루프에서 멋진 DateTime의 AddMonth 기능을 사용하기 때문에 아마도 가장 빠르지는 않습니다.

public static int GetMonthsDiff(DateTime start, DateTime end)
{
    if (start > end)
        return GetMonthsDiff(end, start);

    int months = 0;
    do
    {
        start = start.AddMonths(1);
        if (start > end)
            return months;

        months++;
    }
    while (true);
}

1
Public Class ClassDateOperation
    Private prop_DifferenceInDay As Integer
    Private prop_DifferenceInMonth As Integer
    Private prop_DifferenceInYear As Integer


    Public Function DayMonthYearFromTwoDate(ByVal DateStart As Date, ByVal DateEnd As Date) As ClassDateOperation
        Dim differenceInDay As Integer
        Dim differenceInMonth As Integer
        Dim differenceInYear As Integer
        Dim myDate As Date

        DateEnd = DateEnd.AddDays(1)

        differenceInYear = DateEnd.Year - DateStart.Year

        If DateStart.Month <= DateEnd.Month Then
            differenceInMonth = DateEnd.Month - DateStart.Month
        Else
            differenceInYear -= 1
            differenceInMonth = (12 - DateStart.Month) + DateEnd.Month
        End If


        If DateStart.Day <= DateEnd.Day Then
            differenceInDay = DateEnd.Day - DateStart.Day
        Else

            myDate = CDate("01/" & DateStart.AddMonths(1).Month & "/" & DateStart.Year).AddDays(-1)
            If differenceInMonth <> 0 Then
                differenceInMonth -= 1
            Else
                differenceInMonth = 11
                differenceInYear -= 1
            End If

            differenceInDay = myDate.Day - DateStart.Day + DateEnd.Day

        End If

        prop_DifferenceInDay = differenceInDay
        prop_DifferenceInMonth = differenceInMonth
        prop_DifferenceInYear = differenceInYear

        Return Me
    End Function

    Public ReadOnly Property DifferenceInDay() As Integer
        Get
            Return prop_DifferenceInDay
        End Get
    End Property

    Public ReadOnly Property DifferenceInMonth As Integer
        Get
            Return prop_DifferenceInMonth
        End Get
    End Property

    Public ReadOnly Property DifferenceInYear As Integer
        Get
            Return prop_DifferenceInYear
        End Get
    End Property

End Class

1

이것은 내 라이브러리에서 가져온 것으로 두 날짜 사이의 월 차이를 반환합니다.

public static int MonthDiff(DateTime d1, DateTime d2)
{
    int retVal = 0;

    // Calculate the number of years represented and multiply by 12
    // Substract the month number from the total
    // Substract the difference of the second month and 12 from the total
    retVal = (d1.Year - d2.Year) * 12;
    retVal = retVal - d1.Month;
    retVal = retVal - (12 - d2.Month);

    return retVal;
}

1
이 작동합니까? 나는 계속해서 11 Jan-31-2014Dec-31-2013
장의

1

이와 같은 기능을 가질 수 있습니다.

예를 들어 2012/12/27에서 2012/12/29까지는 3 일이됩니다. 마찬가지로 2012/12/15에서 2013/01/15까지는 2 개월이됩니다. 최대 2013/01/14는 1 개월이기 때문입니다. 15 일부터 두 번째 달이 시작되었습니다.

계산에 이틀을 포함시키지 않으려는 경우 두 번째 if 조건에서 "="를 제거 할 수 있습니다. 즉, 2012/12/15에서 2013/01/15까지는 1 개월입니다.

public int GetMonths(DateTime startDate, DateTime endDate)
{
    if (startDate > endDate)
    {
        throw new Exception("Start Date is greater than the End Date");
    }

    int months = ((endDate.Year * 12) + endDate.Month) - ((startDate.Year * 12) + startDate.Month);

    if (endDate.Day >= startDate.Day)
    {
        months++;
    }

    return months;
}

1

다음 확장자를 사용할 수 있습니다 : 코드

public static class Ext
{
    #region Public Methods

    public static int GetAge(this DateTime @this)
    {
        var today = DateTime.Today;
        return ((((today.Year - @this.Year) * 100) + (today.Month - @this.Month)) * 100 + today.Day - @this.Day) / 10000;
    }

    public static int DiffMonths(this DateTime @from, DateTime @to)
    {
        return (((((@to.Year - @from.Year) * 12) + (@to.Month - @from.Month)) * 100 + @to.Day - @from.Day) / 100);
    }

    public static int DiffYears(this DateTime @from, DateTime @to)
    {
        return ((((@to.Year - @from.Year) * 100) + (@to.Month - @from.Month)) * 100 + @to.Day - @from.Day) / 10000;
    }

    #endregion Public Methods
}

구현!

int Age;
int years;
int Months;
//Replace your own date
var d1 = new DateTime(2000, 10, 22);
var d2 = new DateTime(2003, 10, 20);
//Age
Age = d1.GetAge();
Age = d2.GetAge();
//positive
years = d1.DiffYears(d2);
Months = d1.DiffMonths(d2);
//negative
years = d2.DiffYears(d1);
Months = d2.DiffMonths(d1);
//Or
Months = Ext.DiffMonths(d1, d2);
years = Ext.DiffYears(d1, d2); 

1

다음은 VB.Net DateDiff를 년, 월, 일에만 사용하는 훨씬 간결한 솔루션입니다. C #에서도 DateDiff 라이브러리를로드 할 수 있습니다.

date1은 <= date2 여야합니다.

VB.NET

Dim date1 = Now.AddDays(-2000)
Dim date2 = Now
Dim diffYears = DateDiff(DateInterval.Year, date1, date2) - If(date1.DayOfYear > date2.DayOfYear, 1, 0)
Dim diffMonths = DateDiff(DateInterval.Month, date1, date2) - diffYears * 12 - If(date1.Day > date2.Day, 1, 0)
Dim diffDays = If(date2.Day >= date1.Day, date2.Day - date1.Day, date2.Day + (Date.DaysInMonth(date1.Year, date1.Month) - date1.Day))

씨#

DateTime date1 = Now.AddDays(-2000);
DateTime date2 = Now;
int diffYears = DateDiff(DateInterval.Year, date1, date2) - date1.DayOfYear > date2.DayOfYear ? 1 : 0;
int diffMonths = DateDiff(DateInterval.Month, date1, date2) - diffYears * 12 - date1.Day > date2.Day ? 1 : 0;
int diffDays = date2.Day >= date1.Day ? date2.Day - date1.Day : date2.Day + (System.DateTime.DaysInMonth(date1.Year, date1.Month) - date1.Day);

1

Kirk Woll의 답변에 대한 답변입니다. 아직 댓글에 답할 평판이 충분하지 않습니다 ...

Kirk의 솔루션이 마음에 들었고 그것을 뻔뻔스럽게 찢어 내 코드에서 사용하려고했지만 그것을 살펴보면 너무 복잡하다는 것을 깨달았습니다. 불필요한 스위칭과 루핑, 쓸모없는 퍼블릭 생성자.

내 재 작성은 다음과 같습니다.

public class DateTimeSpan {
    private DateTime _date1;
    private DateTime _date2;
    private int _years;
    private int _months;
    private int _days;
    private int _hours;
    private int _minutes;
    private int _seconds;
    private int _milliseconds;

    public int Years { get { return _years; } }
    public int Months { get { return _months; } }
    public int Days { get { return _days; } }
    public int Hours { get { return _hours; } }
    public int Minutes { get { return _minutes; } }
    public int Seconds { get { return _seconds; } }
    public int Milliseconds { get { return _milliseconds; } }

    public DateTimeSpan(DateTime date1, DateTime date2) {
        _date1 = (date1 > date2) ? date1 : date2;
        _date2 = (date2 < date1) ? date2 : date1;

        _years = _date1.Year - _date2.Year;
        _months = (_years * 12) + _date1.Month - _date2.Month;
        TimeSpan t = (_date2 - _date1);
        _days = t.Days;
        _hours = t.Hours;
        _minutes = t.Minutes;
        _seconds = t.Seconds;
        _milliseconds = t.Milliseconds;

    }

    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2) {
        return new DateTimeSpan(date1, date2);
    }
}

Usage1, 거의 동일합니다.

void Main()
{
    DateTime compareTo = DateTime.Parse("8/13/2010 8:33:21 AM");
    DateTime now = DateTime.Parse("2/9/2012 10:10:11 AM");
    var dateSpan = new DateTimeSpan(compareTo, now);
    Console.WriteLine("Years: " + dateSpan.Years);
    Console.WriteLine("Months: " + dateSpan.Months);
    Console.WriteLine("Days: " + dateSpan.Days);
    Console.WriteLine("Hours: " + dateSpan.Hours);
    Console.WriteLine("Minutes: " + dateSpan.Minutes);
    Console.WriteLine("Seconds: " + dateSpan.Seconds);
    Console.WriteLine("Milliseconds: " + dateSpan.Milliseconds);
}

Usage2, 비슷한 :

void Main()
{
    DateTime compareTo = DateTime.Parse("8/13/2010 8:33:21 AM");
    DateTime now = DateTime.Parse("2/9/2012 10:10:11 AM");
    Console.WriteLine("Years: " + DateTimeSpan.CompareDates(compareTo, now).Years);
    Console.WriteLine("Months: " + DateTimeSpan.CompareDates(compareTo, now).Months);
    Console.WriteLine("Days: " + DateTimeSpan.CompareDates(compareTo, now).Days);
    Console.WriteLine("Hours: " + DateTimeSpan.CompareDates(compareTo, now).Hours);
    Console.WriteLine("Minutes: " + DateTimeSpan.CompareDates(compareTo, now).Minutes);
    Console.WriteLine("Seconds: " + DateTimeSpan.CompareDates(compareTo, now).Seconds);
    Console.WriteLine("Milliseconds: " + DateTimeSpan.CompareDates(compareTo, now).Milliseconds);
}

1

필자의 경우 시작 날짜부터 다음 달이 날짜 전날 또는 시작부터 끝까지의 전체 월을 계산해야합니다.


예 : 2018 년 1 월 1 일
부터 2018 년 1 월 31 일까지는 완전한 달입니다 예 2 : 2018 년 5 월 1 일 부터 2018 년 4 월 2 일까지는 완전한 달입니다.

그래서 여기에 내 해결책이 있습니다.

public static DateTime GetMonthEnd(DateTime StartDate, int MonthsCount = 1)
{
    return StartDate.AddMonths(MonthsCount).AddDays(-1);
}
public static Tuple<int, int> CalcPeriod(DateTime StartDate, DateTime EndDate)
{
    int MonthsCount = 0;
    Tuple<int, int> Period;
    while (true)
    {
        if (GetMonthEnd(StartDate) > EndDate)
            break;
        else
        {
            MonthsCount += 1;
            StartDate = StartDate.AddMonths(1);
        }
    }
    int RemainingDays = (EndDate - StartDate).Days + 1;
    Period = new Tuple<int, int>(MonthsCount, RemainingDays);
    return Period;
}

용법:

Tuple<int, int> Period = CalcPeriod(FromDate, ToDate);

참고 : 필자의 경우 전체 개월 후에 남은 일을 계산해야하므로 날짜가 아닌 경우 일 결과를 무시하거나 튜플에서 정수로 메서드 반환을 변경할 수 있습니다.


1
public static int PayableMonthsInDuration(DateTime StartDate, DateTime EndDate)
{
    int sy = StartDate.Year; int sm = StartDate.Month; int count = 0;
    do
    {
        count++;if ((sy == EndDate.Year) && (sm >= EndDate.Month)) { break; }
        sm++;if (sm == 13) { sm = 1; sy++; }
    } while ((EndDate.Year >= sy) || (EndDate.Month >= sm));
    return (count);
}

이 솔루션은 차이가 뺄셈을 의미하지 않는 임대 / 구독 계산을위한 것이며,이 두 날짜 내에 포함됩니다.


1

같은 연도, 전년도 및 기타 연도의 3 가지 경우가 있습니다.

그 달의 날짜가 중요하지 않으면 ...

public int GetTotalNumberOfMonths(DateTime start, DateTime end)
{
    // work with dates in the right order
    if (start > end)
    {
        var swapper = start;
        start = end;
        end = swapper;
    }

    switch (end.Year - start.Year)
    {
        case 0: // Same year
            return end.Month - start.Month;

        case 1: // last year
            return (12 - start.Month) + end.Month;

        default:
            return 12 * (3 - (end.Year - start.Year)) + (12 - start.Month) + end.Month;
    }
}

1

다른 방법은 나를 위해 작동하지 않았기 때문에 이것을 달성하는 기능을 작성했습니다.

public string getEndDate (DateTime startDate,decimal monthCount)
{
    int y = startDate.Year;
    int m = startDate.Month;

    for (decimal  i = monthCount; i > 1; i--)
    {
        m++;
        if (m == 12)
        { y++;
            m = 1;
        }
    }
    return string.Format("{0}-{1}-{2}", y.ToString(), m.ToString(), startDate.Day.ToString());
}

영어로 답하십시오 (발견 된 언어와 비교).
kleopatra

왜 startDate.AddMonths (monthCount) .ToShortDateString ()을 수행하지 않습니까? 이것은 어쨌든 묻는 원래 질문에 대한 답변이 아닙니다!
TabbyCool

오, @TabbyCool 죄송합니다,이 코드는 내 프로그램에서 잘 작동합니다! 프로그래머 규칙에 따르면 : 첫 번째 코드가 작동 한 다음 최적화됩니다! ur 코멘트에 대한 tanx :)
reza akhlaghi

1

두 날짜 사이의 총 개월 차이에 대한 나의 이해는 정수 부분과 소수 부분 (날짜가 중요 함)을 가지고 있습니다.

필수 부분은 전체 월 차이입니다.

나에게 분수 부분은 시작 달과 끝 달 사이의 하루의 % (달의 전체 일수)의 차이입니다.

public static class DateTimeExtensions
{
    public static double TotalMonthsDifference(this DateTime from, DateTime to)
    {
        //Compute full months difference between dates
        var fullMonthsDiff = (to.Year - from.Year)*12 + to.Month - from.Month;

        //Compute difference between the % of day to full days of each month
        var fractionMonthsDiff = ((double)(to.Day-1) / (DateTime.DaysInMonth(to.Year, to.Month)-1)) -
            ((double)(from.Day-1)/ (DateTime.DaysInMonth(from.Year, from.Month)-1));

        return fullMonthsDiff + fractionMonthsDiff;
    }
}

이 확장으로 결과는 다음과 같습니다.

2/29/2000 TotalMonthsDifference 2/28/2001 => 12
2/28/2000 TotalMonthsDifference 2/28/2001 => 12.035714285714286
01/01/2000 TotalMonthsDifference 01/16/2000 => 0.5
01/31/2000 TotalMonthsDifference 01/01/2000 => -1.0
01/31/2000 TotalMonthsDifference 02/29/2000 => 1.0
01/31/2000 TotalMonthsDifference 02/28/2000 => 0.9642857142857143
01/31/2001 TotalMonthsDifference 02/28/2001 => 1.0

1

당신은 항상 물건을 가정하기 때문에 이것에 대한 명확한 대답이 많지 않습니다.

이 솔루션은 비교를 위해 월을 저장한다고 가정하고 두 날짜 사이의 월을 계산합니다 (달의 날짜가 계산에서 고려 됨).

예를 들어, 2012 년 1 월 30 일의 날짜 인 경우 2012 년 2 월 29 일은 한 달이 아니라 2013 년 3 월 1 일입니다.

꽤 철저하게 테스트되었으므로 나중에 사용하면서 정리할 것입니다.

private static int TotalMonthDifference(DateTime dtThis, DateTime dtOther)
{
    int intReturn = 0;
    bool sameMonth = false;

    if (dtOther.Date < dtThis.Date) //used for an error catch in program, returns -1
        intReturn--;

    int dayOfMonth = dtThis.Day; //captures the month of day for when it adds a month and doesn't have that many days
    int daysinMonth = 0; //used to caputre how many days are in the month

    while (dtOther.Date > dtThis.Date) //while Other date is still under the other
    {
        dtThis = dtThis.AddMonths(1); //as we loop, we just keep adding a month for testing
        daysinMonth = DateTime.DaysInMonth(dtThis.Year, dtThis.Month); //grabs the days in the current tested month

        if (dtThis.Day != dayOfMonth) //Example 30 Jan 2013 will go to 28 Feb when a month is added, so when it goes to march it will be 28th and not 30th
        {
            if (daysinMonth < dayOfMonth) // uses day in month max if can't set back to day of month
                dtThis.AddDays(daysinMonth - dtThis.Day);
            else
                dtThis.AddDays(dayOfMonth - dtThis.Day);
        }
        if (((dtOther.Year == dtThis.Year) && (dtOther.Month == dtThis.Month))) //If the loop puts it in the same month and year
        {
            if (dtOther.Day >= dayOfMonth) //check to see if it is the same day or later to add one to month
                intReturn++;
            sameMonth = true; //sets this to cancel out of the normal counting of month
        }
        if ((!sameMonth)&&(dtOther.Date > dtThis.Date))//so as long as it didn't reach the same month (or if i started in the same month, one month ahead, add a month)
            intReturn++;
    }
    return intReturn; //return month
}

1

위에서 수행 한 탁월한 DateTimeSpan 작업을 기반으로 코드를 약간 정규화했습니다. 이것은 꽤 잘 작동하는 것 같습니다 :

public class DateTimeSpan
{
  private DateTimeSpan() { }

  private DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
  {
    Years = years;
    Months = months;
    Days = days;
    Hours = hours;
    Minutes = minutes;
    Seconds = seconds;
    Milliseconds = milliseconds;
  }

  public int Years { get; private set; } = 0;
  public int Months { get; private set; } = 0;
  public int Days { get; private set; } = 0;
  public int Hours { get; private set; } = 0;
  public int Minutes { get; private set; } = 0;
  public int Seconds { get; private set; } = 0;
  public int Milliseconds { get; private set; } = 0;

  public static DateTimeSpan CompareDates(DateTime StartDate, DateTime EndDate)
  {
    if (StartDate.Equals(EndDate)) return new DateTimeSpan();
    DateTimeSpan R = new DateTimeSpan();
    bool Later;
    if (Later = StartDate > EndDate)
    {
      DateTime D = StartDate;
      StartDate = EndDate;
      EndDate = D;
    }

    // Calculate Date Stuff
    for (DateTime D = StartDate.AddYears(1); D < EndDate; D = D.AddYears(1), R.Years++) ;
    if (R.Years > 0) StartDate = StartDate.AddYears(R.Years);
    for (DateTime D = StartDate.AddMonths(1); D < EndDate; D = D.AddMonths(1), R.Months++) ;
    if (R.Months > 0) StartDate = StartDate.AddMonths(R.Months);
    for (DateTime D = StartDate.AddDays(1); D < EndDate; D = D.AddDays(1), R.Days++) ;
    if (R.Days > 0) StartDate = StartDate.AddDays(R.Days);

    // Calculate Time Stuff
    TimeSpan T1 = EndDate - StartDate;
    R.Hours = T1.Hours;
    R.Minutes = T1.Minutes;
    R.Seconds = T1.Seconds;
    R.Milliseconds = T1.Milliseconds;

    // Return answer. Negate values if the Start Date was later than the End Date
    if (Later)
      return new DateTimeSpan(-R.Years, -R.Months, -R.Days, -R.Hours, -R.Minutes, -R.Seconds, -R.Milliseconds);
    return R;
  }
}

와 비교하면 CompareDates(x, y)어디 x={01/02/2019 00:00:00}y={01/05/2020 00:00:00}한 다음 Months나에게 준다2
Bassie

1

이 간단한 정적 함수는 두 Datetime 사이의 월 비율을 계산합니다. 예 :

  • 1.1. ~ 31.1. = 1.0
  • 1.4. 15.4. = 0.5
  • 16.4. ~ 30.4. = 0.5
  • 1.3. 1.4. = 1 + 1/30

이 함수는 첫 번째 날짜가 두 번째 날짜보다 작다고 가정합니다. 음의 시간 간격을 처리하기 위해 처음에 부호와 변수 스왑을 도입하여 기능을 쉽게 수정할 수 있습니다.

public static double GetDeltaMonths(DateTime t0, DateTime t1)
{
     DateTime t = t0;
     double months = 0;
     while(t<=t1)
     {
         int daysInMonth = DateTime.DaysInMonth(t.Year, t.Month);
         DateTime endOfMonth = new DateTime(t.Year, t.Month, daysInMonth);
         int cutDay = endOfMonth <= t1 ? daysInMonth : t1.Day;
         months += (cutDay - t.Day + 1) / (double) daysInMonth;
         t = new DateTime(t.Year, t.Month, 1).AddMonths(1);
     }
     return Math.Round(months,2);
 }

0

두 날짜 사이의 월 차이를 계산할 수있는 것은 논리적으로해야 할 일이며 많은 비즈니스 응용 프로그램에서 필요합니다. "2010 년 5 월 1 일"과 "2010 년 6 월 16 일 사이의 달의 차이점은 무엇입니까? 2010 년 12 월 31 일과 2011 년 1 월 1 일의 달의 차이점은 무엇입니까?" 비즈니스 응용 프로그램의 기본 사항

위의 2 코멘트에 대한 답변입니다-2010 년 1 월 5 일에서 2010 년 6 월 16 일 사이의 월 수는 1 개월이며, 2010 년 12 월 31 일과 2011 년 1 월 1 일 사이의 월 수는 0입니다. 위의 코더가 제안한 것처럼 1.5 개월 1 초로 계산하는 것은 매우 어리석은 일입니다.

신용 카드, 모기지 처리, 세금 처리, 임대료 처리, 월별이자 계산 및 기타 다양한 비즈니스 솔루션에 종사 한 사람들은 동의 할 것입니다.

문제는 그러한 기능이 해당 문제에 대한 C # 또는 VB.NET에 포함되어 있지 않다는 것입니다. Datediff는 연도 또는 월 구성 요소 만 고려하므로 실제로는 쓸모가 없습니다.

다음은 월을 계산하고 올바르게 계산할 수있는 실제 사례입니다.

귀하는 2 월 18 일부터 23 월 8 일까지 단기 임대에 살았습니다. 몇 달 동안 거기에 있었습니까? 대답은 간단합니다-6 개월

매월 말에이자가 계산되고 지불되는 은행이 있습니다. 당신은 10-jun에 돈을 입금하고 같은 해 29-oct를 꺼냅니다. 몇 개월 동안 관심을 갖습니까? 매우 간단한 답변-4 개월 (추가 일은 중요하지 않음)

비즈니스 응용 프로그램에서 대부분의 경우 월을 계산해야하는 경우 사람이 시간을 계산하는 방법에 따라 '전체'개월을 알아야하기 때문입니다. 추상적 인 / 부적절한 생각에 근거하지 않습니다.


5
이것이 회계가 수학이 아닌 이유 중 하나입니다. 결과를 계산할 때 계산 방법에 따라 결과가 달라집니다. 귀하의 요점과 이에 대한 "일반적인 비즈니스 관점"을 알고 있지만이 설명은 명백히 잘못되었습니다. 2012.11.30과 2012.12.01 사이에 요청한 내용에 따라 0 또는 1/30 또는 1/31 또는 1 또는 2 개월 이 있습니다 . 날짜가 배타적이거나 포괄적 이었습니까? 몇 달 동안 건드 리거나 만졌거나 지나쳤습니까? 반올림, 반올림 또는 정확하길 원하십니까?
케찰코아틀

3
이제 그것을 비즈니스 사람이나 회계사에게 설명하면 그들이 당황스럽게 보일 것입니다. "물론 그들이 X와 Y와 Z를 의미했다는 것은 항상 분명합니다. 어떻게 다르게 생각할 수 있습니까?" 이제 몇 명의 비즈니스 담당자를 확보하고 주제에 대해 동의하도록하십시오. 회계사는 어떤 시점에서 수학을 사용하여 실수로 같은 기간을 두 번 등으로 요약 할 수있는 옵션을 확인하기 때문에 계산에 동의 할 가능성이 큽니다. 추가 일을 무시하는 것과 같은 추가 비즈니스 규칙.
quetzalcoatl

2
-1 모든 소프트웨어가 "비즈니스 응용 프로그램"이라고 가정합니다. 해당 코드의 목적은 언급되지 않았습니다. 또한 모든 "비즈니스 응용 프로그램"에 동일한 규칙이 있다고 가정하지만 이는 사실이 아닙니다.
Jesse Webb

0

ToString (format) 및 Duration (long ms)을 사용하여 확장 된 Kirks 구조체

 public struct DateTimeSpan
{
    private readonly int years;
    private readonly int months;
    private readonly int days;
    private readonly int hours;
    private readonly int minutes;
    private readonly int seconds;
    private readonly int milliseconds;

    public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
    {
        this.years = years;
        this.months = months;
        this.days = days;
        this.hours = hours;
        this.minutes = minutes;
        this.seconds = seconds;
        this.milliseconds = milliseconds;
    }

    public int Years { get { return years; } }
    public int Months { get { return months; } }
    public int Days { get { return days; } }
    public int Hours { get { return hours; } }
    public int Minutes { get { return minutes; } }
    public int Seconds { get { return seconds; } }
    public int Milliseconds { get { return milliseconds; } }

    enum Phase { Years, Months, Days, Done }


    public string ToString(string format)
    {
        format = format.Replace("YYYY", Years.ToString());
        format = format.Replace("MM", Months.ToString());
        format = format.Replace("DD", Days.ToString());
        format = format.Replace("hh", Hours.ToString());
        format = format.Replace("mm", Minutes.ToString());
        format = format.Replace("ss", Seconds.ToString());
        format = format.Replace("ms", Milliseconds.ToString());
        return format;
    }


    public static DateTimeSpan Duration(long ms)
    {
        DateTime dt = new DateTime();
        return CompareDates(dt, dt.AddMilliseconds(ms));
    }


    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
    {
        if (date2 < date1)
        {
            var sub = date1;
            date1 = date2;
            date2 = sub;
        }

        DateTime current = date1;
        int years = 0;
        int months = 0;
        int days = 0;

        Phase phase = Phase.Years;
        DateTimeSpan span = new DateTimeSpan();

        while (phase != Phase.Done)
        {
            switch (phase)
            {
                case Phase.Years:
                    if (current.AddYears(years + 1) > date2)
                    {
                        phase = Phase.Months;
                        current = current.AddYears(years);
                    }
                    else
                    {
                        years++;
                    }
                    break;
                case Phase.Months:
                    if (current.AddMonths(months + 1) > date2)
                    {
                        phase = Phase.Days;
                        current = current.AddMonths(months);
                    }
                    else
                    {
                        months++;
                    }
                    break;
                case Phase.Days:
                    if (current.AddDays(days + 1) > date2)
                    {
                        current = current.AddDays(days);
                        var timespan = date2 - current;
                        span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
                        phase = Phase.Done;
                    }
                    else
                    {
                        days++;
                    }
                    break;
            }
        }

        return span;
    }
}

0
  var dt1 = (DateTime.Now.Year * 12) + DateTime.Now.Month;
  var dt2 = (DateTime.Now.AddMonths(-13).Year * 12) + DateTime.Now.AddMonths(-13).Month;
  Console.WriteLine(dt1);
  Console.WriteLine(dt2);
  Console.WriteLine((dt1 - dt2));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.