CodeGym /행동 /C# SELF /날짜와 시간 계산 및 보조 클래스

날짜와 시간 계산 및 보조 클래스

C# SELF
레벨 15 , 레슨 4
사용 가능

1. 날짜와 시간 다룰 때 주로 하는 일

날짜랑 시간 다루는 건 경험 많은 개발자도 가끔 멘붕 오게 하지. 날짜 비교, 간격 계산, 일/월/년 더하고 빼기, 나이 계산, 요일 구하기 등등 할 게 많거든.

이런 건 할 일 트래커, 캘린더, 구독/멤버십 관리, 금융 계산, 통계 리포트, 그리고 면접 문제(예: "두 날짜 사이 근무일수 구해봐")에서 아주 흔하게 나와.

C#이랑 .NET에는 이런 거 하라고 내장 클래스랑 메서드가 있어. 그리고 대부분 계산은 객체지향적이고, 안전하고, 직관적인 API로 할 수 있어서 좋아.

2. TimeSpan 구조체 — 시간 간격 재기

모든 건 TimeSpan 구조체에서 시작해. 이건 시간의 "조각"이야: 예를 들면 5일, 3시간, 7분, 21초 이런 식.

TimeSpan 어떻게 만들까?

날짜 두 개를 "빼기" 해도 되고, 직접 만들 수도 있어:

// 두 날짜의 차이는 항상 TimeSpan이야!
DateTime start = new DateTime(2025, 5, 1, 7, 0, 0);
DateTime end = new DateTime(2025, 5, 2, 11, 30, 0);

TimeSpan duration = end - start; // 완전 마법이지!
Console.WriteLine(duration); // 1.04:30:00 (1일, 4시간, 30분)

생성자 파라미터로 TimeSpan을 직접 만들 수도 있어:

TimeSpan span = new TimeSpan(2, 14, 18, 0); // 2일, 14시간, 18분, 0초
Console.WriteLine(span); // 2.14:18:00

다른 방법은 static 메서드 쓰는 건데, 이게 더 읽기 쉬울 때가 많아:

TimeSpan fiveMinutes = TimeSpan.FromMinutes(5);
TimeSpan twoHours = TimeSpan.FromHours(2);
TimeSpan oneWeek = TimeSpan.FromDays(7);

TimeSpan에 어떤 속성들이 있을까?

속성 설명
Days
정수 일수
Hours
시간 부분
Minutes
분 부분
Seconds
초 부분
TotalDays
일 단위(소수점 포함)
TotalHours
시간 단위(소수점 포함)
TotalMinutes
분 단위(소수점 포함)
TotalSeconds
초 단위(소수점 포함)
Console.WriteLine($"일수: {duration.Days}, 전체 시간: {duration.TotalHours}");

날짜에 TimeSpan 더하거나 빼기

DateTime now = DateTime.Now;
DateTime future = now.Add(duration); // duration을 now에 더함
DateTime past = now.Subtract(TimeSpan.FromDays(10)); // 10일 빼기

Console.WriteLine(future);
Console.WriteLine(past);

3. 날짜 계산기: 날짜 차이 구하기

이건 거의 항상 쓸 일이 있어. 예를 들어 누군가는 휴가까지 얼마나 남았는지, 누군가는 무료 기간이 언제 끝나는지 궁금해하지.

DateTime today = DateTime.Today;
DateTime vacation = new DateTime(2025, 8, 1);
TimeSpan untilVacation = vacation - today;

Console.WriteLine($"휴가까지 {untilVacation.Days}일 남았어!");

참고: "날짜"만(시간 없이) 빼면(예: DateTime.Date 또는 DateTime.Today로) 결과는 항상 정수 일수야. 근데 하나라도 시간 들어가면 소수점 나올 수 있어.


int days = (vacation - today).TotalDays; // 컴파일 에러! TotalDays는 double이야

정수로 필요하면 .Days 쓰거나 (int)TotalDays로 형변환 해줘.

4. 시간 더하고 빼기: AddDays, AddMonths, AddHours 등등

C#에서는 각 달의 일수, 윤년 이런 거 직접 계산 안 해도 돼. 그냥 이렇게 쓰면 돼:

DateTime orderDate = new DateTime(2024, 4, 20);
DateTime deliveryDate = orderDate.AddDays(14); // 2주 뒤

Console.WriteLine($"상품은 {deliveryDate.ToShortDateString()}에 배송될 거야");
메서드 뭘 더하는지(음수면 빼기)
AddDays(double)
일(소수점 지원, 예: 1.5일)
AddMonths(int)
월(달 길이 자동 처리)
AddYears(int)
년(윤년도 알아서 처리)
AddHours(double)
시간
AddMinutes(double)
AddSeconds(double)
DateTime birthday = new DateTime(2000, 2, 29);
DateTime nextYear = birthday.AddYears(1); // 2001-02-28 (29일 아님, 2001은 윤년 아님)
Console.WriteLine(nextYear.ToShortDateString()); // 28.02.2001

꼭 기억해: 모든 메서드는 새로운 날짜 인스턴스를 반환해. 원본 날짜는 안 바뀌어!

var dt = DateTime.Now;
dt.AddDays(5); // 이건 dt를 안 바꿔!
dt = dt.AddDays(5); // 이렇게 해야 바뀜

5. 계산에 도움되는 메서드들

요일 계산

대부분은 .DayOfWeek 속성 쓰면 돼:

DateTime examDate = new DateTime(2025, 6, 19);
DayOfWeek day = examDate.DayOfWeek;
Console.WriteLine(day); // Wednesday

정수로 바꿀 수도 있어:

int number = (int)day; // Sunday == 0, Monday == 1, 이런 식

"오늘", "어제", "내일" 체크하기

간단 비교로 가능:

DateTime date = new DateTime(2025, 6, 18);

if (date.Date == DateTime.Today)
    Console.WriteLine("오늘이야!");
else if (date.Date == DateTime.Today.AddDays(-1))
    Console.WriteLine("어제야!");
else if (date.Date == DateTime.Today.AddDays(1))
    Console.WriteLine("내일이야!");

나이 계산

사람 나이 제대로 계산하는 것도 자주 나오는 문제야. 그냥 연도 빼면 틀릴 수 있어:

public static int CalculateAge(DateTime birthDate, DateTime currentDate)
{
    int age = currentDate.Year - birthDate.Year;
    
    // 올해 생일이 아직 안 지났으면
    if (currentDate.Month < birthDate.Month || 
        (currentDate.Month == birthDate.Month && currentDate.Day < birthDate.Day))
    {
        age--;
    }
    
    return age;
}

// 사용 예시
DateTime birth = new DateTime(1990, 8, 15);
DateTime today = DateTime.Today;
int age = CalculateAge(birth, today);
Console.WriteLine($"나이: {age}살");

근무일 계산

날짜 사이에서 주말 빼고 근무일수 구하는 것도 자주 해:

public static int CountWorkingDays(DateTime startDate, DateTime endDate)
{
    int workingDays = 0;
    DateTime current = startDate;
    
    while (current <= endDate)
    {
        if (current.DayOfWeek != DayOfWeek.Saturday && 
            current.DayOfWeek != DayOfWeek.Sunday)
        {
            workingDays++;
        }
        current = current.AddDays(1);
    }
    
    return workingDays;
}

6. 주요 클래스들 관계

graph TD
    A(DateTime) --빼기--> B(TimeSpan)
    A2(DateTime) --AddDays, AddMonths--> A
    A --ToLocalTime/ToUniversalTime--> C(DateTimeOffset)
    D(DateOnly) --ToDateTime--> A
    E(TimeOnly) --ToTimeSpan--> B
    A --DayOfWeek, Day, Month, Year--> F(숫자 속성)
    B(TimeSpan) --TotalDays, TotalHours, ...--> G(지속시간 속성)

7. 빠른 "참고표": 이런 게 필요하면...

할 일 뭐 쓰면 됨 예시
날짜 차이 구하기
TimeSpan duration = d2 - d1
(d2 - d1).Days
날짜에 2주 더하기
date.AddDays(14)
date.AddDays(14)
나이 계산
.Year
랑 월/일 체크하는 공식
위에 참고
날짜만 얻거나 설정
DateOnly
DateOnly.FromDateTime(DateTime.Now)
시간만 얻거나 설정
TimeOnly
TimeOnly.FromDateTime(DateTime.Now)
날짜 비교 연산자
<
,
>
,
==
,
.CompareTo()
if (d1 < d2) ...
다른 타임존으로 변환
DateTimeOffset + ToOffset
dto.ToOffset(TimeSpan.FromHours(3))
올해 몇 번째 주인지
Calendar.GetWeekOfYear()
문서 참고
요일 구하기
date.DayOfWeek
근무일수 세기
DayOfWeek
체크하면서 반복문
위에 참고
2
과제
C# SELF, 레벨 15, 레슨 4
잠금
날짜 차이 계산하기
날짜 차이 계산하기
2
과제
C# SELF, 레벨 15, 레슨 4
잠금
요일 구하기
요일 구하기
1
설문조사/퀴즈
날짜 다루기, 레벨 15, 레슨 4
사용 불가능
날짜 다루기
날짜, 시간 그리고 타임존 다루기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION