3. 날짜와 시간 다루기
C#에서 날짜와 시간을 다루는데 중요한 Type으로 다음 2가지가 존재합니다.
DateTime | 특정 날짜와 시간을 표현합니다. |
TimeSpan | 특정 기간을 표현합니다. |
위 2개의 Type은 같이 사용되는 경우가 많은데 예를 들어 다른 것으로부터 DateTime값을 빼는 경우 그 결과로 TimeSpan을 가져오거나 TimeSpan값을 DateTime에 더하는 경우 그 결과로 DateTime값을 가져오는 경우 등이 있습니다.
● 날짜와 시간의 지정
날짜와 시간 값을 생성하는 가장 일반적인 방법은 일과 시간처럼 각각 개별적인 값으로 생성하는 것입니다. 날짜나 시간을 단순 문자열로 표현하면 그것 만으로 파싱이 가능하기는 하지만 문화권에 따라 자칫 잘못 해석될 수 있으므로 문자열로의 표현은 되도록 지향해야 합니다.
년도, 월, 일, 시, 분, 초와 같은 일반적인 값은 DateTime을 사용하는 것만으로 손쉽게 가져올 수 있습니다.
DateTime myBirtday = DateTime.Now;
Console.WriteLine($"현재 날짜및 시간 : {myBirtday}");
//현재 날짜및 시간 : 2022-05-30 오전 11:18:23 (시스템에 설정된 국가나 문화권에 따라 다른 형식으로 표현될 수 있음)
Console.WriteLine($"현재 년도 : {myBirtday.Year}");
Console.WriteLine($"현재 월 : {myBirtday.Month}");
Console.WriteLine($"현재 일 : {myBirtday.Day}");
Console.WriteLine($"현재 시 : {myBirtday.Hour}");
Console.WriteLine($"현재 분 : {myBirtday.Minute}");
Console.WriteLine($"현재 초 : {myBirtday.Second}");
// 현재 년도 : 2022
// 현재 월 : 5
// 현재 일 : 30
// 현재 시 : 11
// 현재 분 : 18
// 현재 초 : 23
이외 다음과 같은 속성을 사용할 수 있습니다.
MinValue | 초기 날짜및 시간대 |
UnixEpoch | UNIX 날짜및 시간대 |
Today | 현재 일자 |
DayOfYear | 해당 년도에서의 현재 경과일자 |
DayOfWeek | 현재 요일 |
날짜와 시간을 더하거나 차감하는 경우 Add~ 메서드를 사용할 수 있으며 단순 차감인 경우 Subtract() 메서드를 사용할 수 있습니다. 예를 들어 특정 일자를 더하고자 하는 경우 AddDays() 메서드를 사용합니다.
Console.WriteLine($"현재 부터 1일 후 : {myBirtday.AddDays(1)}");
Console.WriteLine($"현재 부터 1일 전 : {myBirtday.AddDays(-1)}");
// 현재 부터 1일 후 : 2022-05-31 오전 11:27:29
// 현재 부터 1일 전 : 2022-05-29 오전 11:27:29
만약 값을 -로 지정하면 해당 값만큼 날짜/시간을 차감할 수 있습니다.
Subtract() 메서드는 아래와 같이 사용할 수 있는데
DateTime myBirtday = DateTime.Now;
Console.WriteLine($"현재 부터 1일 전 : {myBirtday.Subtract(TimeSpan.FromDays(1))}");
메서드가 아닌 -, + 연산자를 사용해서도 동일한 구현이 가능합니다.
DateTime myBirthday = new DateTime(2022, 12, 01, 0, 0, 0);
TimeSpan df = myBirthday - DateTime.Now;
Console.WriteLine($"내 생일까지 {df.Days}일 {df.Hours} 시간(총 {df.TotalHours}시간)남음");
//내 생일까지 184일 12 시간(총 4428.013897568083시간)남음
● 날짜와 시간의 지역화
현재 시스템의 국가설정은 날짜와 시간을 어떤 식으로 표현할지를 제어하는 기준이 됩니다. 보편적으로 대한민국은 날짜의 순을 '년-월-일'(yyyy-MM-dd) 순으로 표현하지만 영국권은 'day/month/year'로 미국권은 'month/day/year'로 표현합니다.
그러나 시스템의 설정과 관련 없이 다른 표현방식의 날짜를 다루어야 하는 경우도 있는데 이때는 임의로 해당 국가의 문화권을 지정해 줘야 합니다.
using System;
using System.Globalization;
namespace myapp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"현재 문화권설정 : {CultureInfo.CurrentCulture.Name}");
DateTime currentDate = DateTime.Parse("2022-05-30");
Console.WriteLine($"현재 날짜 : {currentDate.ToShortDateString()}");
//현재 문화권설정 : ko-KR
//현재 날짜 : 2022-05-30
}
}
}
예제는 현재 시스템에 설정된 문화권을 표현하고 yyyy-MM-dd형식의 날짜를 파싱 해 표현하도록 합니다. 이 프로그램의 실행결과는 의도한 대로 날짜를 년-월-일 순으로 정확히 표현하지만 날짜의 형식이 UK문화권에 따라 '일/월/년'으로 표현된 경우라면 시스템은 해당 문화권을 이해하지 못해 예외를 발생시키게 됩니다.
따라서 해당 날짜의 형식이 정확히 UK라는 것을 아래와 같이 명시해야 합니다.
Console.WriteLine($"현재 문화권설정 : {CultureInfo.CurrentCulture.Name}");
DateTime currentDate = DateTime.Parse("30/5/2022", CultureInfo.GetCultureInfo("en-GB"));
Console.WriteLine($"현재 날짜 : {currentDate.ToShortDateString()}");
//현재 문화권설정 : ko-KR
//현재 날짜 : 2022-05-30
● 날짜와 시간의 단독 표현
.NET 6 들어서 날짜와 시간을 표현하기 위한 DateOnly와 TimeOnly라는 2개의 새로운 Type타입이 추가되었습니다. 기존에는 날짜를 만들기 위해 DateTime클래스를 사용하면서 시간을 무시하고 날짜만 다루는 방법을 사용했는데 이제는 타입 안정적이며 시간이 따라옴으로 인한 실수를 DateOnly를 통해서 줄일 수 있게 되었습니다. 또한 DateOnly은 SQL Server의 DB에서 Date컬럼 형식에 일치시킬 수 있고 TimeOnly는 time형식의 컬럼와 일치시킬 수 있게 되었습니다.
DateOnly date = new DateOnly(2022, 5, 30);
TimeOnly time = new TimeOnly(hour: 15, minute: 31, second: 15); //15시 31분 15초
Console.WriteLine($"지정된 날짜 : {date}");
Console.WriteLine($"지정된 시간 : {time}");
//지정된 날짜 : 2022-05-30
//지정된 시간 : 오후 3:31
DateTime dt = date.ToDateTime(time); //날짜와 시간의 결합
Console.WriteLine(dt);
//2022-05-30 오후 3:31:15
'.NET' 카테고리의 다른 글
[.NET] 닷넷 Type 사용하기 - 4. Collection 사용 (0) | 2022.06.26 |
---|---|
[.NET] 닷넷 Type 사용하기 - 3. 정규식(regular expressions) (0) | 2022.06.26 |
[.NET] 닷넷 Type 사용하기 - 1. 숫자, 문자열 (0) | 2022.06.26 |
[.NET] 닷넷 - 5. .NET Framework에서 .NET으로의 전환 (0) | 2022.06.24 |
[.NET] 닷넷 - 4. Decompiling (0) | 2022.06.24 |