Development/C#

[프렉티컬 C#] 날짜와 시간 처리

이쥬딩 2023. 7. 28. 16:46
728x90

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;
        }
    }
728x90