-
[프렉티컬 C#] 날짜와 시간 처리Development/C# 2023. 7. 28. 16:46728x90
DateTime 구조체
- DateTime 형은 불변객체 (string 형도 불변 객체)
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.Now
- 현재 날짜와 시간으로 설정되고 현지 시간으로 표시되는 DateTime 개체를 가져옵니다.
- 날짜와 시각 정보 모두 포함한다.
DateTime localDate = DateTime.Now;
DateTime.DayOfWeek
- 요일을 구할 때 사용한다.
- DayOfWeek 속성은 DayOfWeek 열거형이다.
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.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초
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 구조체
시간 간격을 나타냅니다.
시간 더하기 / 빼기
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);
AddYeays 메서드
AddMonths 메서드
두 시각의 차이 구하기
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 정적 메서드
지정된 월과 연도의 날짜 수를 반환합니다.
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 */
다음 주 특정 요일의 날짜를 구하는 메서드
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; } }
728x90'Development > C#' 카테고리의 다른 글
[C#] delegate와 람다식 (0) 2023.08.28 [C#] 순환참조 (0) 2023.08.16 [C#] 인덱서 (0) 2023.07.27 [프렉티컬 C#] Dictionary (0) 2023.07.27 [프렉티컬 C#] 배열과 List<T> (0) 2023.07.26