본문 바로가기

C#/기본적인 팁

C#에서 날짜와 시간 처리 (DateTime 객체)

1.

DateTime 객체를 생성한다.

var dt1 = new DateTime(2021, 8, 24);
var dt2 = new DateTime(2021, 8, 24, 10, 24, 20);

 

string 형과 마찬가지로 DateTime 형은 불변 객체이므로 속성값을 수정하는 코드를 작성할 수 없다.

 

 

2.

요일을 구하려면 DateTime 구조체에 있는 DayOfWeek 속성을 참조한다.

DayOfWeek 속성의 형은 DayOfWeek 열거형이다.

 

3. 날짜 형식의 문자열DateTime 객체로 변환

날짜 형식의 문자열을 DateTime 객체로 변환하려면 DateTime 구조체에 있는 TryParse라는 정적 메서드를 사용한다.

 

TryParse 메서드는 첫 번째 인수에 변환 대상이 되는 날짜 형식의 문자열을 넘겨준다.

두 번째 인수에는 out 키워드를 붙인 DateTime 형 변수를 지정한다.

변환된 결과가 두 번째 인수인 변수에 저장된다.

변환에 성공하면 true가 반환, 실패하면 false가 반환된다.

DateTime dt1;
if (DateTime.TryParse("2021/8/24", out dt1))
    Console.WriteLine(dt1);

DateTime dt2;
if (DateTime.TryParse("2021/8/24 10:24:20", out dt2))
    Console.WriteLine(dt2);

 

 

DateTime.Parse 메서드를 사용해도 변환할 수 있지만 변환에 실패하면 예외가 발생하므로 이 점을 주의해야 한다.

DateTime dt = DateTime.Parse("20210824");    //FormatException 예외가 발생한다.

 

 

4.

날짜를 자릿수에 맞춰 "2021년03월01일"이라는 형식으로 문자열을 표현하려면 string의 Format함수를 이용한다.

var today = new DateTime(2021, 3, 1);
var str = string.Format("{0}년{1:00}월{2:00}일", today.Year, today.Month, today.Day);
Console.WriteLine(str);

 

 

 

5. 지정한 날짜에 해당하는 요일의 문자열을 구하는 방법

임의 날짜의 요일("월요일"이나 "화요일"과 같은 문자열)을 구하려면 DateTimeFormatInfo 클래스에 있는 GetDayName 메서드를 사용한다.

 

GetDayName 메서드 대신 GetShortestDayName 메서드를 사용하면 첫 문자인 "월"이 출력된다.

 

 

6.

DateTime끼리 비교할 때도 >=, <=, <, >, ==, != 같은 비교 연산자를 이용할 수 있다.

 

 

7. 두 날짜의 비교 : Date 속성

시각 정보를 포함하지 않는 날짜만 비교하려면 Date 속성을 사용해서 비교한다.

if(dt1.Date < dt2.Date)
    Console.WrtieLine("dt2 쪽이 미래이다.");
else if(dt1.Date == dt2.Date)
    Console.WriteLine("dt1와 dt2는 같은 날짜이다.");

 

 

두 날짜의 차를 구하려면 Date 속성끼리 뺄셈을 한다.

Date 속성을 사용하지 않으면 날짜의 차이를 제대로 구할 수 없다.

두 시각의 차가 24시간이 안되면 0일간이라는 결과가 나와 Date 속성을 사용해야한다.

TimeSpan diff = date2.Date - date1.Date;

 

 

8.

DateTime 객체에 TimeSpan 구조체의 값을 더하면 h시간 m분 s초 이후의 시각을 구할 수 있다.

//2시간 45분 이후의 시각을 구하는 코드
var now = DateTime.Now;
var future = now + new TimeSpan(2, 45, 0);

 

 

9.

n일 후와 n일 전의 날짜를 구하려면 AddDays 메서드를 사용한다.

음수값을 인수에 넘겨주면 과거의 날짜를 구할 수 있다.

var today = DateTime.Today;
var future = today.AddDays(20);
var past = today.AddDays(-20);

//날짜 연산에서 주의해야할 점은 DateTime은 불변 객체라는 것이다.
//date 자체를 20일 후의 날짜로 만들고 싶다면 다음과 같이 객체를 대입하여 객체를 바꿔줘야한다.
date = date.AddDays(20);

 

n년 후와 n 개월 후를 구하려면 AddYears 메서드AddMonths 메서드를 이용한다.

 

 

10.

두 시각의 차를 구하려면 음수 연산자를 사용한다.

결과는 시간 간격을 나타내는 TimeSpan형이 된다.

var date1 = new DateTime(2020, 5, 6, 9, 5, 28);
var date2 = new DateTime(2021, 8, 24, 1, 30, 21);
TimeSpan diff = date2 - date1;
Console.WriteLine(“두 시각의 차는 {0}일 {1}시간 {2}분 {3}초입니다.”, diff.Days, diff.Hours, diff.Minutes, diff.Seconds);
Console.WriteLine(“총 {0}초입니다.”, diff.TotalSeconds);

 

11.

DaysInMonth라는 정적 메서드를 사용하면 해당 월에 며칠이 있는지 알 수 있다.
따라서 DaysInMonth 메서드로 구한 값을 사용하면 해당 월의 말일을 구할 수 있다.

 

 

12.

DaysOfYear 속성을 사용하면 1월 1일부터의 날짜 수를 구할 수 있다.

 

 

13.

DateTime 구조체에 있는 IsLeapYear라는 정적 메서드를 사용하면 윤년인지 여부를 조사할 수 있다.