2015-01-30 2 views
0

가, 내가 분명히C#의 날짜 범위

var date = "20140231"; 
var scope = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture); 

왼쪽하고있다 "20140231"는 2월의 끝을 말하는 게으른 방법입니다. "20140231"입력으로 2 월 마지막 날짜를 얻는 가장 깨끗한 방법은 무엇입니까?

1 개 제약이있다 -이 .NET 2.0와 함께 작동합니다.

+1

무엇에 대한 윤년 생각? –

+0

"20140230"은 어떻습니까? –

+0

음,이 예제는 임의 선택이 아닙니다. 여전히 입력 29, 30, 31에 대해 매월 마지막 날짜를 원합니다. – Margus

답변

14
string date = "20140231"; 
DateTime result; 
int year = Convert.ToInt32(date.Substring(0, 4)); 
int month = Convert.ToInt32(date.Substring(4, 2)); 
int day = Convert.ToInt32(date.Substring(6, 2)); 

result = new DateTime(year, month, Math.Min(DateTime.DaysInMonth(year, month), day)); 
1

당신은 while 만들 조각 날짜를 절단하고 유효한 날짜가 될 때까지 하루 부분에서 하나를 뺀 유지할 수 있습니다. 이것은 입구 쪽에서 정말로 고쳐야한다.

이 시도 :

var date = "20140231"; 
DateTime scope; 
bool dateValid = DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture, DateTimeStyles.None, out scope); 

while (!dateValid) 
{ 
    string yearMonth = date.Substring(0, 4); 
    int day = Convert.ToInt32(date.Substring(6, 2)); 

    if (day > 1) 
    { 
     day--; 
    } 
    else 
    { 
     break; 
    } 

    date = yearMonth + day.ToString().PadLeft(2, '0'); 

    dateValid = DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture, DateTimeStyles.None, out scope); 
} 
5

February28 또는 29일을 가질 수 있습니다 것은 현재 연도에 의존하는 것은 leap year 여부를합니다.

그것은 어떤 년 30 또는 31일을 가질 수 없습니다. 그래서 20140231 문자열을 성공적으로 구문 분석 할 수 없습니다.

2 월 마지막 날은 분명히 알 수 있습니다.

DateTime lastDayOfFebruary = (new DateTime(2014, 2, 1)).AddMonths(1).AddDays(-1); 

첫 번째 4 문자로 항상 GET 년 서비스 , 당신은 해 얻을 수 .Substring()을 사용하여 1 년으로 DateTime constructor을 통과 할 수 있습니다.

var date = "20140231"; 
string year = date.Substring(0, 4); 
DateTime lastDayOfFebruary = (new DateTime(int.Parse(year), 2, 1)).AddMonths(1).AddDays(-1); 
+0

이것은 서비스에서 제공 한 날짜를 어떻게 변환합니까? –

+0

그래서 ** 새로운 DateTime (int.Parse (date.Substring (1,4)), int.Parse (date.Substring (5,6)), int.Parse (date.Substring (7,8))) * *,이 경우 3 월 3 일을 반환합니까? 새로운 ** DateTime (int.Parse (date.Substring (1,4)), int.Parse (date.Substring (5,6)), 1) .AddMonths (1) .AddDays (-1) * * 그리고 분을 가져 가라. 그러나 매우 깨끗하지 않은 thats. – Margus

+0

@PatrickHofman OP 날짜가 없기 때문에 그레고리오 달력의 문자열 '20140231'을 파싱 할 수 없습니다. 서비스 반환 문자열에 항상 연도가 처음 4 자로 포함되어 있으면이 값을 'DateTime'생성자에서 전달할 수 있습니다. –