C#의 TimeSpan.Subtract() 메서드는 현재 TimeSpan 인스턴스에서 지정된 TimeSpan 값을 빼서 새로운 TimeSpan 객체를 반환합니다. 이 메서드는 시간 간격 간의 차이를 계산할 때 필수적으로 사용됩니다.
구문 (Syntax)
public TimeSpan Subtract(TimeSpan span);
매개변수
- span: 현재 인스턴스에서 뺄 시간 간격 (
TimeSpan타입)
반환 값
현재 인스턴스에서 span을 뺀 결과로서 새로운 TimeSpan 객체를 반환합니다. 결과가 음수 시간 간격이 될 수도 있습니다.
예제 1: 기본적인 뺄셈 연산
다양한 방식으로 생성된 TimeSpan 객체들 간의 뺄셈을 보여줍니다.
using System;
public class Demo {
public static void Main() {
// 다양한 단위로 TimeSpan 생성
TimeSpan span1 = TimeSpan.FromTicks(1); // 1틱 (100나노초)
TimeSpan span2 = new TimeSpan(1); // 1틱 (동일)
TimeSpan span3 = TimeSpan.FromHours(1); // 1시간
TimeSpan span4 = TimeSpan.FromMilliseconds(1); // 1밀리초
TimeSpan span5 = TimeSpan.FromMinutes(1); // 1분
TimeSpan span6 = TimeSpan.FromMinutes(1); // 1분
// 각 TimeSpan 값 출력
Console.WriteLine("TimeSpan1 = " + span1);
Console.WriteLine("TimeSpan2 = " + span2);
Console.WriteLine("TimeSpan3 = " + span3);
Console.WriteLine("TimeSpan4 = " + span4);
Console.WriteLine("TimeSpan5 = " + span5);
// 비교 연산 (참고용)
Console.WriteLine("비교 (span1 vs span2) = " + TimeSpan.Compare(span1, span2));
Console.WriteLine("비교 (span2 vs span3) = " + TimeSpan.Compare(span2, span3));
Console.WriteLine("비교 (span1 vs span3) = " + TimeSpan.Compare(span1, span3));
Console.WriteLine("비교 (span3 vs span4) = " + TimeSpan.Compare(span3, span4));
Console.WriteLine("비교 (span4 vs span5) = " + TimeSpan.Compare(span4, span5));
// Subtract 메서드 사용
TimeSpan res1 = span1.Subtract(span2); // 동일 값끼리 뺄셈
TimeSpan res2 = span2.Subtract(span2); // 자기 자신 뺄셈
Console.WriteLine("결과 (span1 - span2) = " + res1);
Console.WriteLine("결과 (span2 - span2) = " + res2);
}
}
실행 결과
TimeSpan1 = 00:00:00.0000001
TimeSpan2 = 00:00:00.0000001
TimeSpan3 = 01:00:00
TimeSpan4 = 00:00:00.0010000
TimeSpan5 = 00:01:00
비교 (span1 vs span2) = 0
비교 (span2 vs span3) = -1
비교 (span1 vs span3) = -1
비교 (span3 vs span4) = 1
비교 (span4 vs span5) = -1
결과 (span1 - span2) = 00:00:00
결과 (span2 - span2) = 00:00:00
예제 2: 실제 시나리오에서의 시간 차이 계산
더 현실적인 시간 간격들 간의 뺄셈을 보여줍니다.
using System;
public class Demo {
public static void Main() {
TimeSpan span1 = TimeSpan.FromTicks(1500); // 0.00015초
TimeSpan span2 = new TimeSpan(2, 40, 55); // 2시간 40분 55초
TimeSpan span3 = TimeSpan.FromHours(5); // 5시간
TimeSpan span4 = TimeSpan.FromMilliseconds(1000); // 1초
TimeSpan span5 = TimeSpan.FromMinutes(50); // 50분
TimeSpan span6 = TimeSpan.FromMinutes(50); // 50분
Console.WriteLine("TimeSpan1 = " + span1);
Console.WriteLine("TimeSpan2 = " + span2);
Console.WriteLine("TimeSpan3 = " + span3);
Console.WriteLine("TimeSpan4 = " + span4);
Console.WriteLine("TimeSpan5 = " + span5);
Console.WriteLine("비교 (span1 vs span2) = " + TimeSpan.Compare(span1, span2));
Console.WriteLine("비교 (span2 vs span3) = " + TimeSpan.Compare(span2, span3));
Console.WriteLine("비교 (span1 vs span3) = " + TimeSpan.Compare(span1, span3));
Console.WriteLine("비교 (span3 vs span4) = " + TimeSpan.Compare(span3, span4));
Console.WriteLine("비교 (span4 vs span5) = " + TimeSpan.Compare(span4, span5));
// 큰 값에서 작은 값 빼기 (음수 결과 발생)
TimeSpan res1 = span1.Subtract(span2);
// 같은 값끼리 빼기
TimeSpan res2 = span2.Subtract(span2);
Console.WriteLine("결과 (span1 - span2) = " + res1);
Console.WriteLine("결과 (span2 - span2) = " + res2);
}
}
실행 결과
TimeSpan1 = 00:00:00.0001500
TimeSpan2 = 02:40:55
TimeSpan3 = 05:00:00
TimeSpan4 = 00:00:01
TimeSpan5 = 00:50:00
비교 (span1 vs span2) = -1
비교 (span2 vs span3) = -1
비교 (span1 vs span3) = -1
비교 (span3 vs span4) = 1
비교 (span4 vs span5) = -1
결과 (span1 - span2) = -02:40:54.9998500
결과 (span2 - span2) = 00:00:00
핵심 포인트 및 주의사항
- 불변성:
TimeSpan은 불변(immutable) 타입이므로,Subtract()는 기존 인스턴스를 변경하지 않고 새로운 인스턴스를 반환합니다. - 음수 결과 허용: 뺄셈 결과가 음수 시간 간격이 될 수 있습니다 (예제 2의 res1 참고).
- 연산자 오버로딩:
span1 - span2형태의 빼기 연산자(-)도 동일하게 작동하며, 내부적으로Subtract()를 호출합니다. - 예외 처리: 이 메서드는 예외를 던지지 않으며, 오버플로우 시
TimeSpan.MinValue또는TimeSpan.MaxValue를 반환합니다.
관련 메서드
TimeSpan.Add()/+연산자: 시간 간격 더하기TimeSpan.Compare(): 두 TimeSpan 비교 (-1, 0, 1 반환)TimeSpan.Duration(): 절대값(양수) 시간 간격 반환TimeSpan.Negate(): 부호 반전
요약
TimeSpan.Subtract() 메서드는 두 시간 간격의 차이를 구할 때 사용하는 핵심 메서드입니다. 반환값이 새로운 TimeSpan 객체이므로 체이닝이 가능하며, 음수 결과도 정상적으로 처리됩니다. 실제로는 빼기 연산자(-)를 더 자주 사용하지만, 메서드 형태가 필요한 경우(예: LINQ, 리플렉션 등)에 유용합니다.