[프렉티컬 C#] 날짜와 시간 처리
DateTime 구조체
- DateTime 형은 불변객체 (string 형도 불변 객체)
DateTime 구조체 (System)
일반적으로 날짜와 시간으로 표현된 시간의 한 순간을 나타냅니다.
learn.microsoft.com
DateTime 객체 생성
// 연, 월,일까지만 생성하거나
DateTime date1 = new DateTime(2010, 8, 18);
// 시, 분, 초까지 생성할 수 있다.
DateTime date2 = new DateTime(2010, 8, 18, 8, 45, 20);
DateTime.Today
- 현재의 날짜만 반환한다.
- 시각 정보는 포함하지 않는다. (시간 구성 요소가 00:00:00으로 설정)
- 시간을 제외한 현재 날짜만 반환 하기 때문에 날짜만 사용하는 애플리케이션에 적합 합니다.
DateTime thisDay = DateTime.Today;
DateTime.Today 속성 (System)
현재 날짜를 가져옵니다.
learn.microsoft.com
DateTime.Now
- 현재 날짜와 시간으로 설정되고 현지 시간으로 표시되는 DateTime 개체를 가져옵니다.
- 날짜와 시각 정보 모두 포함한다.
DateTime localDate = DateTime.Now;
DateTime.Now 속성 (System)
이 컴퓨터의 현재 날짜와 시간으로 설정되고 현지 시간으로 표시되는 DateTime 개체를 가져옵니다.
learn.microsoft.com
DateTime.DayOfWeek
- 요일을 구할 때 사용한다.
- DayOfWeek 속성은 DayOfWeek 열거형이다.
DateTime.DayOfWeek 속성 (System)
이 인스턴스가 나타내는 주의 일 수를 가져옵니다.
learn.microsoft.com
DateOfWeek 열거형
Friday | 5 | 금요일을 나타냅니다. |
Monday | 1 | 월요일을 나타냅니다. |
Saturday | 6 | 토요일을 나타냅니다. |
Sunday | 0 | 일요일을 나타냅니다. |
Thursday | 4 | 목요일을 나타냅니다. |
Tuesday | 2 | 화요일을 나타냅니다. |
Wednesday | 3 | 수요일을 나타냅니다. |
DateTime.TryParse
날짜 형식의 문자열을 DateTime 객체로 변환할 때 사용한다.
변환에 성공했는지를 나타내는 값을 반환한다. (true, false)
DateTime.Parse 메서드도 변환 가능하지만 변환에 실패하면 예외 발생한다.
// 초기화하지 않고 변수를 선언할 때는 컴파일러가 변수형을 특정할 수 없기 때문에 var 키워드 사용 불가
DateTime date1;
if (DateTime.TryParse("2017/6/21", out date1))
Console.WriteLine(date1);
DateTime date2;
if (DateTime.TryParse("2017-6-21", out date2))
Console.WriteLine(date2);
DateTime date3;
if (DateTime.TryParse("2017/6/21 10:41:38", out date3))
Console.WriteLine(date3);
/*
6/21/2017 12:00:00 AM
6/21/2017 12:00:00 AM
6/21/2017 10:41:38 AM
*/
DateTime.TryParse 메서드 (System)
날짜와 시간에 대한 지정된 문자열 표현을 해당 DateTime 요소로 변환하고, 변환에 성공했는지를 나타내는 값을 반환합니다.
learn.microsoft.com
날짜의 포맷
DateTime.ToString
- DateTime을 다양한 형식의 문자열로 변환할 때 사용한다.
- '월'은 대문자 M 사용, '분'은 소문자 m 사용
- ddd는 요일 한글자로 생략(일, 월...), dddd는 요일 전체 출력(일요일, 월요일...)
var date = new DateTime(2017, 10, 22, 21, 6, 47);
var s1 = date.ToString("d"); // 10/22/2017
var s2 = date.ToString("D"); // Sunday, October 22, 2017
var s3 = date.ToString("yyyy-MM-dd"); // 2017-10-22
var s4 = date.ToString("yyyy년M월d일(ddd)"); // 2017년10월22일(Sun)
var s5 = date.ToString("yyyy년MM월dd일 HH시mm분ss초"); // 2017년10월22일 21시06분47초
var s6 = date.ToString("f"); // Sunday, October 22, 2017 9:06 PM
var s7 = date.ToString("F"); // Sunday, October 22, 2017 9:06:47 PM
var s8 = date.ToString("t"); // 9:06 PM
var s9 = date.ToString("T"); // 9:06:47 PM
var s10 = date.ToString("tt hh:mm"); // PM 09:06
var s11 = date.ToString("HH시mm분ss초"); // 21시06분47초
문화권 지정해 주면 아래와 같이 출력된다.
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("ko-KR");
var date = new DateTime(2017, 10, 22, 21, 6, 47);
var s1 = date.ToString("d"); // 2017. 10. 22.
var s2 = date.ToString("D"); // 2017년 10월 22일 일요일
var s3 = date.ToString("yyyy-MM-dd"); // 2017-10-22
var s4 = date.ToString("yyyy년M월d일(ddd)"); // 2017년10월22일(일)
var s5 = date.ToString("yyyy년MM월dd일 HH시mm분ss초"); // 2017년10월22일 21시06분47초
var s6 = date.ToString("f"); // 2017년 10월 22일 일요일 오후 9:06
var s7 = date.ToString("F"); // 2017년 10월 22일 일요일 오후 9:06:47
var s8 = date.ToString("t"); // 오후 9:06
var s9 = date.ToString("T"); // 오후 9:06:47
var s10 = date.ToString("tt hh:mm"); // 오후 09:06
var s11 = date.ToString("HH시mm분ss초"); // 21시06분47초
DateTime.ToString 메서드 (System)
현재 DateTime 개체의 값을 해당하는 문자열 표현으로 변환합니다.
learn.microsoft.com
String.Format으로도 서식 지정 가능
var today = DateTime.Today;
var str = string.Format("{0}년{1,2:00}월{2,2:00}일",
today.Year, today.Month, today.Day);
/*
2023년07월28일
*/
지정한 날짜에 해당하는 요일의 문자열 구하기
var date = new DateTime(1998, 6, 25);
var culture = new CultureInfo("ko-KR");
culture.DateTimeFormat.Calendar = new KoreanCalendar();
var dayOfWeek = culture.DateTimeFormat.GetDayName(date.DayOfWeek); // 출력 : 목요일
Console.WriteLine(dayOfWeek);
var shortDayOfWeek = culture.DateTimeFormat.GetShortestDayName(date.DayOfWeek); // 출력 : 목
Console.WriteLine(shortDayOfWeek);
DateTime 비교
1. 날짜와 시간 비교
- DateTime끼리 비교할 때 >=, <=, <, >, ==, != 같은 연산자 사용 가능하다.
- 날짜만 비교할때는 Date 속성 사용해서 비교한다.
2. 날짜 계산
TimeSpan 구조체
시간 간격을 나타냅니다.
TimeSpan 구조체 (System)
시간 간격을 나타냅니다.
learn.microsoft.com
시간 더하기 / 빼기
DateTime 객체에 TimeSpan 구조체의 값을 더하거나 빼면 된다.
var now = DateTime.Now;
var future = now + new TimeSpan(1, 30, 0);
var past = now - new TimeSpan(1, 30, 0);
날짜 더하기 / 빼기
AddDays 메서드
지정된 날짜 수를 인스턴스의 값에 더하는 새 DateTime을 반환합니다.
var today = DateTime.Today;
var future = today.AddDays(20);
var past = today.AddDays(-20);
DateTime.AddDays(Double) 메서드 (System)
지정된 날짜 수를 이 인스턴스의 값에 더하는 새 DateTime을 반환합니다.
learn.microsoft.com
AddYeays 메서드
DateTime.AddYears(Int32) 메서드 (System)
지정된 연도 수를 이 인스턴스의 값에 더하는 새 DateTime을 반환합니다.
learn.microsoft.com
AddMonths 메서드
DateTime.AddMonths(Int32) 메서드 (System)
지정된 월 수를 이 인스턴스의 값에 더하는 새 DateTime을 반환합니다.
learn.microsoft.com
두 시각의 차이 구하기
var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2 - date1;
Console.WriteLine("두 시각의 차는 {0}일 {1}시간 {2}분 {3}초입니다.",
diff.Days, diff.Hours, diff.Minutes, diff.Seconds);
Console.WriteLine("총 {0}초입니다.", diff.TotalSeconds);
/*
두 시각의 차는 0일 1시간 10분 36초입니다.
총 4236초입니다.
*/
두 날짜의 차이 구하기
꼭 Date 속성 사용해서 구하기
var dt1 = new DateTime(2016, 1, 20, 23, 0, 0);
var dt2 = new DateTime(2016, 1, 21, 1, 0, 0);
TimeSpan diff = dt2.Date - dt1.Date;
Console.WriteLine("{0}일간", diff.Days);
해당 월의 말일 구하기
DateTime.DaysInMonth 정적 메서드
지정된 월과 연도의 날짜 수를 반환합니다.
DateTime.DaysInMonth(Int32, Int32) 메서드 (System)
지정된 월과 연도의 날짜 수를 반환합니다.
learn.microsoft.com
var today = new DateTime(2023, 02, 01);
int day = DateTime.DaysInMonth(today.Year, today.Month);
Console.WriteLine(day);
/*
28
*/
DateTtime.DayOfYear 속성
1월 1일부터 지정한 DateTime의 날짜까지의 날짜 수를 반환한다.
var today = new DateTime(2023, 1, 31);
int dayOfYear = today.DayOfYear;
Console.WriteLine(dayOfYear);
var today2 = new DateTime(2023, 2, 28);
int dayOfYear2 = today2.DayOfYear;
Console.WriteLine(dayOfYear2);
/*
31
59
*/
DateTime.DayOfYear 속성 (System)
이 인스턴스가 나타내는 일 수를 정수로 가져옵니다.
learn.microsoft.com
다음 주 특정 요일의 날짜를 구하는 메서드
static void Main(string[] args)
{
Console.WriteLine(NextDay(DateTime.Now, DayOfWeek.Friday));
Console.WriteLine(NextDay(DateTime.Now, DayOfWeek.Monday));
}
public static DateTime NextDay(DateTime date, DayOfWeek dayOfWeek)
{
var days = (int)dayOfWeek - (int)(date.DayOfWeek);
if (days <= 0)
days += 7;
return date.AddDays(days);
}
만 나이 / 한국식 나이 구하는 메서드
static void Main(string[] args)
{
var birthday = new DateTime(1992, 4, 5);
var today = DateTime.Today;
int age = GetAge(birthday, today);
int koreanAge = GetKoreanAge(birthday, today);
Console.WriteLine(age);
Console.WriteLine(koreanAge);
}
public static int GetAge(DateTime birthday, DateTime targetDay)
{
var age = targetDay.Year - birthday.Year;
if (targetDay < birthday.AddYears(age))
{
age--;
}
return age;
}
public static int GetKoreanAge(DateTime birthday, DateTime targetDay)
{
var age = targetDay.Year - birthday.Year + 1;
return age;
}
지정한 날짜가 몇 주 째인지 구하는 메서드
static void Main(string[] args)
{
var date = DateTime.Today;
var nth = NthWeek(date);
Console.WriteLine("{0}주째", nth);
}
public static int NthWeek(DateTime date)
{
var firstDay = new DateTime(date.Year, date.Month, 1);
var firstDayOfWeek = (int)(firstDay.DayOfWeek);
return (date.Day + firstDayOfWeek - 1) / 7 + 1;
}
지정한 달의 n번째의 x요일의 날짜 구하기
static void Main(string[] args)
{
DateTime day = DayOfNthWeek(2016, 9, DayOfWeek.Sunday, 3);
Console.WriteLine(day);
DateTime day1 = DayOfNthWeek(2017, 1, DayOfWeek.Sunday, 5);
Console.WriteLine(day1);
// 해당 날이 존재하지 않으면 예외가 발생한다
DateTime day2 = DayOfNthWeek(2017, 1, DayOfWeek.Wednesday, 5);
Console.WriteLine(day2);
}
public static DateTime DayOfNthWeek(int year, int month, DayOfWeek dayOfWeek, int nth)
{
// LINQ를 사용해서 첫 번째 X요일이 몇일인지를 구한다
var firstDay = Enumerable.Range(1, 7)
.Select(d => new DateTime(year, month, d))
.First(d => d.DayOfWeek == dayOfWeek)
.Day;
// 첫 번째 X요일의 날짜에 7의 배수를 더하면 n번째 X요일을 구할 수 있다
var day = firstDay + (nth - 1) * 7;
return new DateTime(year, month, day);
}
연습문제
문제 8.1
// 8.1
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("ko-KR");
var dateTime = DateTime.Now;
var dateTime1 = dateTime.ToString("yyyy/M/dd HH:mm");
var dateTime2 = dateTime.ToString("yyyy년MM월dd일 HH시mm분ss초");
var dateTime3 = dateTime.ToString("yyyy년M월d일(dddd)");
Console.WriteLine(dateTime1);
Console.WriteLine(dateTime2);
Console.WriteLine(dateTime3);
문제 8.2
static void Main(string[] args)
{
var nextDay = NextDay(new DateTime(2023, 08, 14), DayOfWeek.Tuesday);
Console.WriteLine(nextDay);
}
public static DateTime NextDay(DateTime date, DayOfWeek dayOfWeek)
{
var days = (int)dayOfWeek - (int)(date.DayOfWeek);
days += 7;
return date.AddDays(days);
}
리뷰
가독성면에서 예제가 더 이쁜 것 같다...!
예제
public static DateTime NextWeek(DateTime date, DayOfWeek dayOfWeek)
{
var nextweek = date.AddDays(7);
var days = (int)dayOfWeek - (int)(date.DayOfWeek);
return nextweek.AddDays(days);
}
문제 8.3
static void Main(string[] args)
{
var tw = new TimeWatch();
tw.Start();
Thread.Sleep(3000);
TimeSpan duration = tw.Stop();
Console.WriteLine("처리 시간은 {0}밀리초였습니다.", duration.TotalMilliseconds);
}
public class TimeWatch
{
private DateTime startTime;
public void Start()
{
startTime = DateTime.Now;
}
public TimeSpan Stop()
{
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime - startTime;
return duration;
}
}
리뷰
전역 변수명은 앞에 _ 붙이는 것 같다...메모메모
stop 함수 예제 처럼 심플하게 할 수 있는데 나 왤케 변수 선언하고 복잡하게 했지?!!!!!
예제
class Program {
static void Main(string[] args) {
var tw = new TimeWatch();
tw.Start();
Thread.Sleep(1000);
TimeSpan duration = tw.Stop();
Console.WriteLine("처리 시간은{0}밀리초였습니다.", duration.TotalMilliseconds);
}
}
class TimeWatch {
private DateTime _time;
public void Start() {
_time = DateTime.Now;
}
public TimeSpan Stop() {
return DateTime.Now - _time;
}
}