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에 어떤 속성들이 있을까?
| 속성 | 설명 |
|---|---|
|
정수 일수 |
|
시간 부분 |
|
분 부분 |
|
초 부분 |
|
일 단위(소수점 포함) |
|
시간 단위(소수점 포함) |
|
분 단위(소수점 포함) |
|
초 단위(소수점 포함) |
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()}에 배송될 거야");
| 메서드 | 뭘 더하는지(음수면 빼기) |
|---|---|
|
일(소수점 지원, 예: 1.5일) |
|
월(달 길이 자동 처리) |
|
년(윤년도 알아서 처리) |
|
시간 |
|
분 |
|
초 |
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. 빠른 "참고표": 이런 게 필요하면...
| 할 일 | 뭐 쓰면 됨 | 예시 |
|---|---|---|
| 날짜 차이 구하기 | |
|
| 날짜에 2주 더하기 | |
|
| 나이 계산 | 랑 월/일 체크하는 공식 |
위에 참고 |
| 날짜만 얻거나 설정 | |
|
| 시간만 얻거나 설정 | |
|
| 날짜 비교 | 연산자 , , , |
|
| 다른 타임존으로 변환 | |
|
| 올해 몇 번째 주인지 | |
문서 참고 |
| 요일 구하기 | |
|
| 근무일수 세기 | 체크하면서 반복문 |
위에 참고 |
GO TO FULL VERSION