.NET에서 날짜와 시간 다루기

  • 50 minutes to read

안녕하세요. 박용준 강사입니다. 이번에는 .NET에서 날짜와 시간을 다루는 방법에 대해 알아보겠습니다. 날짜와 시간은 컴퓨터 프로그래밍에서 매우 중요한 역할을 합니다. 예를 들어, 어떤 사건이 일어난 시간을 기록하거나 특정 날짜 이후의 일정을 계산하는 등의 작업을 수행할 때 날짜와 시간을 다루는 기능이 필요합니다.

.NET에서는 다양한 방법으로 날짜와 시간을 다룰 수 있습니다. C#에서는 DateTime 구조체를 사용하여 날짜와 시간을 생성하고, 비교하며, 연산하고, 출력할 수 있습니다. ASP.NET Core에서는 Razor 문법을 사용하여 HTML 페이지에서 날짜와 시간 값을 출력할 수 있습니다. 또한, 다양한 라이브러리를 사용하여 시간대 변환, 다국어 지원, 등의 기능을 구현할 수 있습니다.

이번 강의에서는 .NET에서 날짜와 시간을 다루는 방법을 자세히 알아보고, 실습을 통해 실제로 사용해보는 기회를 가지도록 하겠습니다. 시작해 봅시다!

CAUTION

이 강의 내용은 비주얼아카데미 유튜브 채널에 올라가 있는 C# 교과서 마스터하기 강의를 모두 학습이 완료되었다고 가정하고 진행합니다. C# 기초 문법과 더불어 ASP.NET Core에 대한 사용 경험이 있으면 더욱 좋습니다.

목차

  1. Date와 Time이란?

    • Date와 Time의 정의
    • Date와 Time의 중요성
    • Date와 Time의 표기법
  2. C#에서 Date와 Time 다루기

    • DateTime 클래스 소개
    • 날짜와 시간 값 생성하기
    • 날짜와 시간 값 비교하기
    • 날짜와 시간 값 출력하기
  3. C#에서 Date와 Time 연산하기

    • 날짜와 시간 값 더하기/빼기
    • 시간 간격 계산하기
    • 날짜 형식 변환하기
  4. ASP.NET Core에서 Date와 Time 다루기

    • ASP.NET Core에서 날짜와 시간 값 다루기
    • 날짜와 시간 값을 데이터베이스에 저장하기
    • 날짜와 시간 값을 출력하기
  5. Time Zone 처리

    • 시간대(Time Zone)의 개념
    • 시간대의 종류와 표기법
    • 시간대 변환하기
  6. 다국어 지원을 위한 Date와 Time 처리

    • 날짜와 시간 값을 현지 언어로 표시하기
    • 날짜와 시간 값을 현지 시간대로 표시하기
  7. 주요 라이브러리 소개

    • NodaTime 라이브러리
    • TimeZoneConverter 라이브러리
  8. 실습 예제

    • C#에서 Date와 Time 다루기 실습
    • ASP.NET Core에서 Date와 Time 다루기 실습
  9. 기타

1. Date와 Time이란?

  • Date와 Time의 정의
    • Date는 날짜를 나타내는 값으로 연, 월, 일을 표현합니다.
    • Time은 시간을 나타내는 값으로 시, 분, 초를 표현합니다.
    • Date와 Time을 합쳐서 DateTime으로 나타낼 수 있습니다.
  • Date와 Time의 중요성
    • Date와 Time은 컴퓨터 프로그래밍에서 매우 중요한 개념 중 하나입니다. 예를 들어, 로그인한 시간을 기록하거나, 새로운 문서를 만든 시간을 기록하는 등의 작업에서 날짜와 시간을 다룹니다.
    • Date와 Time은 사람과 컴퓨터 간의 상호작용에서도 중요합니다. 사람은 일반적으로 날짜와 시간을 표기할 때 표준 형식을 사용하지만, 이 표준 형식은 국가와 지역마다 다르기 때문에 컴퓨터에서 이를 처리하려면 적절한 방법이 필요합니다.
  • Date와 Time의 표기법
    • Date와 Time은 각각 다양한 표기법이 있습니다. 예를 들어, "2023년 2월 27일 16시 30분 15초"와 같은 표기법이 있습니다.
    • 이 표기법은 지역과 언어에 따라 달라질 수 있습니다. 예를 들어, 미국에서는 "2/27/2023 4:30:15 PM"과 같은 표기법을 사용합니다.
    • 또한, ISO 8601 표준 형식을 사용하여 표기할 수도 있습니다. 이 표준 형식은 "2023-02-27T16:30:15"와 같은 형식을 가지며, 전 세계적으로 사용됩니다.

C# 교과서 복습

  • DateTime 구조체
  • TimeSpan 구조체

2. C#에서 Date와 Time 다루기

  • DateTime 클래스 소개
    • C#에서 Date와 Time을 다루는 데 가장 기본적으로 사용되는 클래스는 DateTime입니다. 이 클래스는 .NET Framework의 일부로 제공되며, 다양한 날짜와 시간 연산을 지원합니다.
  • 날짜와 시간 값 생성하기
    • DateTime.Now 속성을 사용하여 현재 시간을 가져올 수 있습니다.
    • DateTime.Today 속성을 사용하여 오늘 날짜를 가져올 수 있습니다.
    • DateTime 클래스의 생성자를 사용하여 특정 날짜와 시간 값을 생성할 수 있습니다.
  • 날짜와 시간 값 비교하기
    • DateTime.Now 속성을 사용하여 현재 시간을 가져온 뒤, 다른 DateTime 값을 가져와 비교할 수 있습니다.
    • 비교 연산자(>, <, >=, <=)를 사용하여 두 DateTime 값을 비교할 수 있습니다.
  • 날짜와 시간 값 출력하기
    • ToString() 메서드를 사용하여 DateTime 값을 문자열로 변환할 수 있습니다.
    • ToString() 메서드는 다양한 형식 문자열을 사용하여 출력 형식을 지정할 수 있습니다.
    • 또한, 특정 문화권에 맞게 날짜와 시간 값을 출력할 수 있습니다. 이를 위해서는 CultureInfo 클래스를 사용하여 현재 문화권 정보를 가져오고, ToString() 메서드에 전달할 수 있습니다.

3. C#에서 Date와 Time 연산하기

  • 날짜와 시간 값 더하기/빼기
    • DateTime 클래스의 Add()와 Subtract() 메서드를 사용하여 날짜와 시간 값을 더하거나 빼서 새로운 DateTime 값을 생성할 수 있습니다.
    • TimeSpan 구조체를 사용하여 날짜와 시간 값에 시간 간격을 더하거나 빼서 새로운 DateTime 값을 생성할 수 있습니다.
  • 시간 간격 계산하기
    • DateTime 값과 DateTime 값 간의 시간 간격을 계산하려면 Subtract() 메서드를 사용하면 됩니다.
    • TimeSpan 구조체를 사용하여 시간 간격을 계산할 수 있습니다.
  • 날짜 형식 변환하기
    • ToString() 메서드를 사용하여 DateTime 값을 특정 형식의 문자열로 변환할 수 있습니다.
    • Parse() 메서드를 사용하여 특정 형식의 문자열을 DateTime 값으로 변환할 수 있습니다.
    • TryParse() 메서드를 사용하여 문자열을 DateTime 값으로 변환하는 도중 발생할 수 있는 예외를 처리할 수 있습니다.

다음은 C#에서 Date와 Time을 다루는 간단한 예제입니다. 이 예제는 현재 날짜와 시간을 출력하는 기본적인 예제입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // 현재 날짜와 시간 가져오기
        DateTime now = DateTime.Now;

        // 현재 날짜와 시간 출력
        Console.WriteLine("현재 날짜와 시간: {0}", now);
        
        // 현재 날짜 출력
        Console.WriteLine("현재 날짜: {0}", now.ToShortDateString());

        // 현재 시간 출력
        Console.WriteLine("현재 시간: {0}", now.ToShortTimeString());

        // 특정 날짜와 시간 생성
        DateTime christmas = new DateTime(2023, 12, 25, 0, 0, 0);

        // 특정 날짜와 시간 출력
        Console.WriteLine("크리스마스: {0}", christmas);
        
        // 두 날짜 간의 차이 계산
        TimeSpan daysUntilChristmas = christmas - now;

        // 남은 날짜 출력
        Console.WriteLine("크리스마스까지 {0}일 남았습니다.", daysUntilChristmas.Days);
    }
}

위 예제에서는 DateTime.Now 속성을 사용하여 현재 시간 값을 가져옵니다. ToShortDateString() 및 ToShortTimeString() 메서드를 사용하여 각각 날짜와 시간을 문자열로 변환하여 출력합니다. 또한, DateTime의 생성자를 사용하여 특정 날짜와 시간 값을 생성하고, 이를 출력하며, 두 날짜 간의 차이를 계산하여 출력합니다.

C#에서 불변성 이해하기: DateTime과 함께 작업하기

C#에서 DateTime 구조체는 날짜와 시간을 나타내는 데 사용되는 널리 사용되는 데이터 유형입니다. 이 글에서는 DateTime의 불변성(읽기 전용) 특성에 대해 설명하고 이를 사용하는 방법을 알아봅니다.

DateTime 구조체 이해하기

C#의 DateTime 구조체는 날짜와 시간 값을 나타내는 데 사용됩니다. DateTime은 불변 객체(immutable)로 설계되어 있어 값을 변경할 수 없습니다. 대신 DateTime 메서드는 새로운 DateTime 객체를 반환합니다. 이러한 특성은 프로그램에서 오류를 줄이고 코드의 가독성을 높이는 데 도움이 됩니다.

DateTime 객체와 불변성

다음 예제를 살펴봅시다.

DateTime dateTime = new DateTime(2023, 1, 1, 0, 0, 0);
DateTime updatedDateTime = dateTime.AddHours(5);

위의 코드에서 dateTime 객체는 2023년 1월 1일 0시 0분 0초로 생성되었습니다. 이후 dateTime.AddHours(5)를 호출하여 5시간을 더했지만 원래의 dateTime 값은 변경되지 않았습니다.

AddHours() 메서드는 새로운 DateTime 객체를 반환하기 때문에, updatedDateTime 변수에 반환된 값을 할당하면 이 변수는 2023년 1월 1일 오전 5시 0분 0초를 나타냅니다. 원래의 dateTime 객체는 여전히 2023년 1월 1일 오전 12시 0분 0초를 나타냅니다.

결론

C#의 DateTime 구조체는 불변성을 가지고 있어 값이 생성된 후에 변경할 수 없습니다. 이 특성은 코드의 안정성을 높이고 가독성을 향상시키는 데 도움이 됩니다. DateTime 객체를 사용할 때 이러한 특성을 염두에 두고 새로운 값을 저장하려면 새로운 변수에 반환된 객체를 할당해야 합니다.

4. ASP.NET Core에서 Date와 Time 다루기

  • ASP.NET Core에서 날짜와 시간 값 다루기
    • ASP.NET Core에서는 C#에서 날짜와 시간 값을 다루는 방법과 동일하게 DateTime 클래스를 사용하여 날짜와 시간 값을 다룹니다.
    • 또한, TimeZoneInfo 클래스를 사용하여 시간대 정보를 저장하고 처리할 수 있습니다.
  • 날짜와 시간 값을 데이터베이스에 저장하기
    • 데이터베이스에 날짜와 시간 값을 저장할 때, 일반적으로 DateTime 형식을 사용합니다.
    • Entity Framework Core를 사용하는 경우, DateTime 값을 데이터베이스에 저장할 때 자동으로 형식이 맞게 변환됩니다.
  • 날짜와 시간 값을 출력하기
    • ASP.NET Core에서는 C#에서 날짜와 시간 값을 출력하는 방법과 동일하게 ToString() 메서드를 사용하여 DateTime 값을 문자열로 변환할 수 있습니다.
    • 또한, ASP.NET Core에서는 Razor 문법을 사용하여 View 페이지에서 날짜와 시간 값을 출력할 수 있습니다. Razor 문법을 사용하면 서버 측 코드와 HTML을 결합하여 동적인 웹 페이지를 생성할 수 있습니다.

다음은 ASP.NET Core에서 Date와 Time을 다루는 간단한 예제입니다. 이 예제는 현재 날짜와 시간을 출력하는 ASP.NET Core 애플리케이션을 생성합니다.

먼저, ASP.NET Core 웹 애플리케이션을 생성합니다. 그런 다음, HomeController.cs 파일에 다음 코드를 추가합니다.

using Microsoft.AspNetCore.Mvc;
using System;

public class HomeController : Controller
{
    public IActionResult Index()
    {
        // 현재 날짜와 시간 가져오기
        DateTime now = DateTime.Now;

        // ViewData에 값을 저장하여 View로 전달
        ViewData["Now"] = now;

        return View();
    }
}

위 코드에서는 Index 메서드에서 현재 날짜와 시간 값을 가져온 다음, ViewData에 값을 저장하여 View로 전달합니다.

다음으로, Index.cshtml 파일에 다음 코드를 추가합니다.

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">현재 날짜와 시간</h1>
    <p class="lead">@ViewData["Now"]</p>
</div>

위 코드에서는 ViewData에서 전달받은 현재 날짜와 시간 값을 출력합니다.

애플리케이션을 실행하면, 현재 날짜와 시간이 출력되는 것을 확인할 수 있습니다. 이 예제는 간단하지만, 날짜와 시간 값을 모델에서 처리하고, 뷰에서 출력하는 방법을 보여줍니다.

5. Time Zone 처리

  • 시간대(Time Zone)의 개념
    • 시간대는 지구상의 각 지역에서 사용하는 시간의 차이를 나타냅니다.
    • UTC(Universal Time Coordinated)를 기준으로 지구상의 모든 지역을 24개의 시간대로 나누어 정의합니다.
    • 시간대는 지구상의 경도에 따라 결정됩니다.
  • 시간대의 종류와 표기법
    • 시간대는 일반적으로 알파벳 세 글자로 표기됩니다. 예를 들어, 한국 표준시는 KST(Korea Standard Time)로 표기됩니다.
    • 세계 각 지역에서 사용되는 시간대의 목록은 IANA(Internet Assigned Numbers Authority)에서 관리됩니다.
  • 시간대 변환하기
    • .NET에서는 TimeZoneInfo 클래스를 사용하여 시간대 정보를 저장하고 처리할 수 있습니다.
    • DateTime 값에 대한 시간대 변환은 ConvertTime() 메서드나 TimeZoneInfo.ConvertTime() 메서드를 사용하여 수행할 수 있습니다.
    • DateTimeOffset 구조체를 사용하여 특정 날짜와 시간에 대한 UTC와 지역 시간 간의 차이를 나타낼 수 있습니다.

다음은 C#에서 Time Zone을 처리하는 간단한 예제입니다. 이 예제는 현재 시간을 다양한 Time Zone에서 출력하는 예제입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // 현재 시간 가져오기
        DateTime now = DateTime.Now;

        // 현재 시간을 다양한 Time Zone에서 출력
        Console.WriteLine("현재 시간: {0}", now.ToLocalTime());
        Console.WriteLine("서울 시간: {0}", now.ToTimeZone("Korea Standard Time"));
        Console.WriteLine("LA 시간: {0}", now.ToTimeZone("Pacific Standard Time"));
        Console.WriteLine("런던 시간: {0}", now.ToTimeZone("GMT Standard Time"));
    }
}

public static class DateTimeExtensions
{
    // Time Zone에 따라 시간을 변환하는 확장 메서드
    public static DateTime ToTimeZone(this DateTime dateTime, string timeZoneId)
    {
        var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
        return TimeZoneInfo.ConvertTimeFromUtc(dateTime.ToUniversalTime(), timeZone);
    }
}

위 코드에서는 DateTimeExtensions 클래스를 사용하여 ToTimeZone 확장 메서드를 정의합니다. 이 메서드는 Time Zone의 ID를 인수로 받아 해당 Time Zone에 따라 시간을 변환합니다.

Main 메서드에서는 ToLocalTime 메서드를 사용하여 현재 시간을 로컬 시간으로 변환하고, ToTimeZone 메서드를 사용하여 서울, LA, 런던의 시간을 각각 출력합니다. 이 예제에서는 TimeZoneInfo 클래스를 사용하여 Time Zone 정보를 가져옵니다.

DateTimeOffset 구조체

다음은 .NET에서 DateTimeOffset 구조체를 사용하는 간단한 예제입니다.

using System;

// DateTimeOffset 사용 예제
DateTimeOffset dateTimeOffset = 
    new DateTimeOffset(2023, 2, 27, 14, 30, 0, new TimeSpan(9, 0, 0));
Console.WriteLine("DateTimeOffset: {0}", dateTimeOffset);
Console.WriteLine("DateTime: {0}", dateTimeOffset.DateTime);
Console.WriteLine("Offset: {0}", dateTimeOffset.Offset);
Console.WriteLine("Local DateTime: {0}", dateTimeOffset.LocalDateTime);
Console.WriteLine("Utc DateTime: {0}", dateTimeOffset.UtcDateTime);

위 코드에서는 DateTimeOffset 구조체를 생성하고, 이를 이용하여 다양한 정보를 출력합니다. DateTimeOffset 구조체는 DateTime 구조체와 함께 시간 값을 표현하는 구조체이며, UTC 오프셋 정보를 포함하고 있습니다.

먼저, 생성된 DateTimeOffset 구조체를 출력하고, DateTime 속성을 사용하여 날짜와 시간 값을 출력합니다. 그리고 Offset 속성을 사용하여 UTC 오프셋 값을 출력합니다.

이후, LocalDateTime 속성을 사용하여 현재 로컬 시간 값을 출력하고, UtcDateTime 속성을 사용하여 현재 UTC 시간 값을 출력합니다.

위 예제에서는 DateTimeOffset 구조체를 사용하여 시간 값을 표현하고, 다양한 시간 값을 계산하는 것을 볼 수 있습니다.따라서, DateTimeOffset 구조체는 .NET에서 시간 값을 다루는 데 있어 매우 유용한 구조체입니다.

ToOffset 메서드

이 예제에서는 DateTimeOffset을 생성하고 ToOffset() 메서드를 사용하여 다른 시간 오프셋으로 변환합니다.

using System;

namespace DateTimeOffsetExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 현재 시간을 기준으로 DateTimeOffset 인스턴스 생성
            DateTimeOffset currentTime = DateTimeOffset.Now;
            Console.WriteLine($"Current time: {currentTime}");

            // 원하는 오프셋 설정 (예: UTC+2 시간대)
            TimeSpan targetOffset = TimeSpan.FromHours(2);

            // ToOffset() 메서드를 사용하여 새로운 오프셋으로 변환
            DateTimeOffset convertedTime = currentTime.ToOffset(targetOffset);
            Console.WriteLine($"Time in UTC+2: {convertedTime}");
        }
    }
}

이 프로그램을 실행하면 현재 시간과 변환된 시간이 출력됩니다. 이 예제에서는 UTC+2 시간대로 시간을 변환하였습니다. 원하는 다른 오프셋으로 변환하려면, TimeSpan.FromHours() 메서드의 인수를 변경하면 됩니다.

시스템 타임존 확인

TimeZoneInfo.GetSystemTimeZones() 메서드를 사용하여 시스템의 모든 시간대를 가져오는 간단한 예제입니다.

using System;
using System.Collections.ObjectModel;

namespace GetSystemTimeZonesExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 시스템의 모든 시간대를 가져옵니다.
            ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();

            Console.WriteLine("시스템에서 사용 가능한 시간대 목록:");
            Console.WriteLine("------------------------------------------------");

            // 가져온 시간대 목록을 순회하며 출력합니다.
            foreach (TimeZoneInfo timeZone in timeZones)
            {
                Console.WriteLine(timeZone);
            }

            Console.WriteLine("------------------------------------------------");
            Console.WriteLine($"총 {timeZones.Count}개의 시간대가 있습니다.");
        }
    }
}

이 프로그램을 실행하면 사용 가능한 모든 시간대와 총 시간대의 수를 출력합니다. 시간대 정보는 각 시간대의 표준 이름, 표준 오프셋, 그리고 일광 절약 시간 적용 여부 등을 포함하고 있습니다.

6. 다국어 지원을 위한 Date와 Time 처리

  • 날짜와 시간 값을 현지 언어로 표시하기
    • .NET에서는 지역화(Localization)를 지원하여 다국어 지원을 제공합니다.
    • DateTime 값을 출력할 때, ToString() 메서드에 인자로 현지 문화권(Culture)을 전달하여 현지 언어로 표시할 수 있습니다.
    • Culture 클래스를 사용하여 현지 문화권을 정의하고 사용할 수 있습니다.
  • 날짜와 시간 값을 현지 시간대로 표시하기
    • 현지 시간대를 사용하여 DateTime 값을 출력하려면 ToString() 메서드에 인자로 현지 문화권과 함께 현지 시간대를 전달해야 합니다.
    • TimeZoneInfo 클래스를 사용하여 현지 시간대 정보를 저장하고 처리할 수 있습니다.

다음은 .NET에서 다국어 지원을 위한 Date와 Time 처리에 대한 간단한 예제입니다. 이 예제는 DateTimeFormatInfo 클래스를 사용하여 날짜와 시간 값을 현지 언어와 현지 시간대로 변환하는 예제입니다.

using System;
using System.Globalization;

class Program
{
    static void Main(string[] args)
    {
        // 한국어 날짜 형식
        var koreanCulture = new CultureInfo("ko-KR");
        var koreanDateTimeFormat = koreanCulture.DateTimeFormat;
        
        // 미국 영어 날짜 형식
        var usCulture = new CultureInfo("en-US");
        var usDateTimeFormat = usCulture.DateTimeFormat;

        // 현재 날짜와 시간 가져오기
        DateTime now = DateTime.Now;

        // 현지 언어로 날짜와 시간 값을 출력
        Console.WriteLine(now.ToString(koreanDateTimeFormat));
        Console.WriteLine(now.ToString(usDateTimeFormat));

        // 현지 시간대로 날짜와 시간 값을 출력
        Console.WriteLine(now.ToLocalTime().ToString(koreanDateTimeFormat));
        Console.WriteLine(now.ToLocalTime().ToString(usDateTimeFormat));
    }
}

위 코드에서는 CultureInfo 클래스를 사용하여 한국어와 미국 영어에 대한 날짜 형식 정보를 가져옵니다. DateTimeFormat 속성을 사용하여 날짜와 시간에 대한 형식 정보를 가져올 수 있습니다.

Main 메서드에서는 현재 시간 값을 가져온 다음, ToString 메서드를 사용하여 한국어와 미국 영어에 대한 형식 정보를 사용하여 문자열로 변환합니다. ToLocalTime 메서드를 사용하여 현지 시간대로 변환한 다음, ToString 메서드를 사용하여 현지 언어와 현지 시간대에 맞는 문자열로 변환합니다.

이 예제는 간단하지만, .NET에서 제공하는 DateTimeFormatInfo 클래스를 사용하여 다국어 지원을 쉽게 구현할 수 있다는 것을 보여줍니다.

7. 주요 라이브러리 소개

  • NodaTime 라이브러리
    • NodaTime은 .NET에서 시간과 날짜를 다루기 위한 오픈 소스 라이브러리입니다.
    • C#에서 제공하는 기본적인 DateTime 클래스와는 달리, NodaTime은 시간대(TimeZone)와 기간(Period)을 별도의 클래스로 제공합니다.
    • NodaTime은 ISO-8601 표준을 준수하여 시간과 날짜를 처리합니다.
  • TimeZoneConverter 라이브러리
    • TimeZoneConverter는 .NET에서 TimeZoneInfo 객체를 다루기 위한 라이브러리입니다.
    • Olson Time Zone Database를 사용하여 표준 시간대 식별자와 시간대 정보를 매핑합니다.
    • Windows 및 IANA 시간대 식별자 간의 변환을 지원합니다.

다음은 .NET에서 NodaTime 라이브러리를 사용하여 Date와 Time을 처리하는 간단한 예제입니다. 이 예제는 현재 날짜와 시간 값을 출력하고, 이를 다양한 Time Zone으로 변환하는 예제입니다.

먼저, NodaTime 라이브러리를 프로젝트에 추가합니다. NuGet 패키지 관리자에서 "NodaTime" 패키지를 검색하여 설치합니다.

다음으로, 다음 코드를 작성합니다.

using NodaTime;

class Program
{
    static void Main(string[] args)
    {
        // 시스템 시간대로 시계 생성
        var clock = SystemClock.Instance;

        // 현재 시간 가져오기
        var now = clock.GetCurrentInstant().InUtc();

        // 현재 시간 출력
        System.Console.WriteLine("현재 시간: {0}", now);

        // 서울 시간대로 변환
        var seoulTimeZone = DateTimeZoneProviders.Tzdb["Asia/Seoul"];
        var seoulTime = now.InZone(seoulTimeZone);
        System.Console.WriteLine("서울 시간: {0}", seoulTime);

        // LA 시간대로 변환
        var laTimeZone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"];
        var laTime = now.InZone(laTimeZone);
        System.Console.WriteLine("LA 시간: {0}", laTime);

        // 런던 시간대로 변환
        var londonTimeZone = DateTimeZoneProviders.Tzdb["Europe/London"];
        var londonTime = now.InZone(londonTimeZone);
        System.Console.WriteLine("런던 시간: {0}", londonTime);
    }
}

위 코드에서는 NodaTime 라이브러리를 사용하여 다양한 Time Zone에 대한 시간을 계산합니다. SystemClock 클래스를 사용하여 시계를 생성하고, GetCurrentInstant 메서드를 사용하여 현재 시간 값을 가져옵니다. InUtc 메서드를 사용하여 시간 값을 UTC 시간으로 변환합니다.

다음으로, DateTimeZoneProviders 클래스를 사용하여 Time Zone 정보를 가져온 다음, InZone 메서드를 사용하여 시간 값을 해당 Time Zone에 맞는 시간 값으로 변환합니다.

이 예제는 NodaTime 라이브러리를 사용하여 Date와 Time 값을 처리하는 방법을 보여줍니다. NodaTime은 .NET에서 Date와 Time을 처리하는 라이브러리 중 하나로, 좀 더 정확하고 세밀한 처리가 필요한 경우 유용하게 사용될 수 있습니다.

다음은 .NET에서 TimeZoneConverter 라이브러리를 사용하여 Time Zone을 처리하는 간단한 예제입니다. 이 예제는 TimeZoneInfo 클래스를 사용하여 Time Zone을 가져오는 대신, 문자열로 된 Time Zone ID를 사용하여 TimeZoneInfo 클래스의 인스턴스를 생성합니다.

먼저, TimeZoneConverter 라이브러리를 프로젝트에 추가합니다. NuGet 패키지 관리자에서 "TimeZoneConverter" 패키지를 검색하여 설치합니다.

다음으로, 다음 코드를 작성합니다.

using System;
using TimeZoneConverter;

class Program
{
    static void Main(string[] args)
    {
        // 현재 시간 가져오기
        DateTime now = DateTime.Now;

        // Time Zone ID 가져오기
        string seoulTimeZoneId = "Asia/Seoul";

        // Time Zone ID를 TimeZoneInfo 인스턴스로 변환
        TimeZoneInfo seoulTimeZone = TZConvert.GetTimeZoneInfo(seoulTimeZoneId);

        // 서울 시간대로 변환
        DateTime seoulTime = TimeZoneInfo.ConvertTime(now, seoulTimeZone);
        Console.WriteLine("서울 시간: {0}", seoulTime);

        // LA 시간대로 변환
        string laTimeZoneId = "Pacific Standard Time";
        TimeZoneInfo laTimeZone = TZConvert.GetTimeZoneInfo(laTimeZoneId);
        DateTime laTime = TimeZoneInfo.ConvertTime(now, laTimeZone);
        Console.WriteLine("LA 시간: {0}", laTime);

        // 런던 시간대로 변환
        string londonTimeZoneId = "GMT Standard Time";
        TimeZoneInfo londonTimeZone = TZConvert.GetTimeZoneInfo(londonTimeZoneId);
        DateTime londonTime = TimeZoneInfo.ConvertTime(now, londonTimeZone);
        Console.WriteLine("런던 시간: {0}", londonTime);
    }
}

위 코드에서는 TimeZoneConverter 라이브러리를 사용하여 문자열로 된 Time Zone ID를 TimeZoneInfo 클래스의 인스턴스로 변환합니다. TZConvert 클래스의 GetTimeZoneInfo 메서드를 사용하여 문자열로 된 Time Zone ID를 TimeZoneInfo 인스턴스로 변환할 수 있습니다.

다음으로, ConvertTime 메서드를 사용하여 현재 시간 값을 해당 Time Zone에 맞는 시간 값으로 변환합니다.

이 예제는 TimeZoneConverter 라이브러리를 사용하여 문자열로 된 Time Zone ID를 TimeZoneInfo 클래스의 인스턴스로 변환하는 방법을 보여줍니다. TimeZoneInfo 클래스의 인스턴스를 생성하는 것보다 더 쉽고 간편한 방법을 제공합니다.

8. 실습 예제

  • C#에서 Date와 Time 다루기 실습
    • C#에서 Date와 Time을 다루는 실습을 통해 DateTime 클래스를 사용하는 방법을 익힐 수 있습니다.
    • 날짜와 시간 값 생성, 비교, 출력, 연산, 현지화 등의 기본적인 작업을 실습할 수 있습니다.
  • ASP.NET Core에서 Date와 Time 다루기 실습
    • ASP.NET Core에서 Date와 Time을 다루는 실습을 통해 웹 애플리케이션에서 날짜와 시간을 처리하는 방법을 익힐 수 있습니다.
    • 날짜와 시간 값을 모델에서 처리하고, 데이터베이스에 저장하고, 뷰에서 출력하는 작업을 실습할 수 있습니다.
    • ASP.NET Core의 Tag Helper를 사용하여 날짜와 시간 값을 입력하고 출력하는 방법을 실습할 수 있습니다.

ISO 8601 소개

ISO 8601은 날짜와 시간 값을 국제적으로 표준화하기 위한 국제 표준화 기구(ISO)에서 제정한 표준 규격입니다. 이 표준은 날짜와 시간 값을 표현하는 방식을 통일화하여 혼란을 방지하고, 다양한 컴퓨터 시스템과 프로그래밍 언어에서 데이터 교환을 원활하게 하기 위해 만들어졌습니다.

ISO 8601은 다양한 날짜와 시간 값을 표현하는 방식을 제공합니다. 예를 들어, 날짜 값을 표현할 때는 "YYYY-MM-DD"의 형식을 사용하며, 시간 값을 표현할 때는 "THH:mm:ss"의 형식을 사용합니다. 또한, 시간대(Time Zone)를 표현할 때는 "±HH:mm" 또는 "Z"의 형식을 사용합니다.

ISO 8601은 다양한 프로그래밍 언어와 시스템에서 널리 사용되고 있으며, .NET에서도 날짜와 시간 값을 다룰 때 자주 언급됩니다. 예를 들어, C#에서는 DateTime.ToString 메서드를 사용하여 ISO 8601 형식으로 날짜와 시간 값을 표현할 수 있으며, JSON 데이터 형식에서도 ISO 8601 형식을 사용하여 날짜와 시간 값을 표현합니다.

따라서, .NET에서 날짜와 시간 값을 다룰 때 ISO 8601 표준을 준수하는 것은 데이터 교환의 효율성을 높이고, 시스템 간 호환성을 보장하는 데 중요한 역할을 합니다.

.NET에서 ISO 8601 표준을 사용하는 간단한 예제는 다음과 같습니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // 현재 날짜와 시간을 ISO 8601 형식으로 출력
        string iso8601DateTime = DateTime.Now.ToString("o");
        Console.WriteLine("현재 날짜와 시간 (ISO 8601): {0}", iso8601DateTime);

        // ISO 8601 형식의 문자열을 DateTime 값으로 변환
        string iso8601String = "2022-02-27T14:30:00.0000000+09:00";
        DateTime dateTime = DateTime.Parse(iso8601String);
        Console.WriteLine("문자열을 DateTime 값으로 변환: {0}", dateTime);
    }
}

위 예제에서는 현재 날짜와 시간 값을 ToString 메서드를 사용하여 "o" 형식으로 출력합니다. "o" 형식은 ISO 8601 형식으로 출력하는 형식 지정자입니다.

또한, DateTime.Parse 메서드를 사용하여 ISO 8601 형식의 문자열을 DateTime 값으로 변환하는 방법을 보여줍니다. Parse 메서드는 입력된 문자열이 ISO 8601 형식을 따르는 경우, 자동으로 해당 형식으로 변환합니다.

이와 같이, .NET에서는 다양한 클래스와 메서드를 통해 ISO 8601 표준을 지원하고 있으며, 이를 활용하여 다양한 시스템과 프로그램 간 데이터 교환을 원활하게 할 수 있습니다.

UtcNow

.NET에서는 DateTime.UtcNow 속성을 사용하여 현재 UTC 시간을 가져올 수 있습니다. 다음은 .NET에서 UtcNow를 사용하는 간단한 예제입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // UtcNow 사용 예제
        DateTime utcTime = DateTime.UtcNow;
        Console.WriteLine("UTC 시간: {0}", utcTime);
    }
}

위 코드에서는 DateTime.UtcNow 속성을 사용하여 현재 UTC 시간을 가져온 후, Console.WriteLine 메서드를 사용하여 출력합니다.

DateTime.UtcNow 속성은 시스템의 시계를 기반으로 현재 UTC 시간을 가져옵니다. 이를 사용하여 현재 UTC 시간을 쉽게 가져올 수 있으며, 시스템의 시계가 변경되더라도 정확한 UTC 시간을 가져올 수 있습니다.

.NET에서는 DateTimeOffset.UtcNow 속성을 사용하여 현재 UTC 시간과 UTC 오프셋을 포함하는 DateTimeOffset 구조체를 생성할 수 있습니다. 다음은 .NET에서 DateTimeOffset.UtcNow를 사용하는 간단한 예제입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // UtcNow 사용 예제
        DateTimeOffset utcOffset = DateTimeOffset.UtcNow;
        Console.WriteLine("현재 UTC 시간: {0}", utcOffset);
    }
}

위 코드에서는 DateTimeOffset.UtcNow 속성을 사용하여 현재 UTC 시간과 UTC 오프셋을 포함하는 DateTimeOffset 구조체를 생성합니다. 이후, Console.WriteLine 메서드를 사용하여 DateTimeOffset 구조체를 출력합니다.

DateTimeOffset 구조체는 시간 값과 함께 UTC 오프셋 정보를 가지고 있어, 시간 값을 특정 시간대와 연결하여 사용할 수 있습니다. 이를 사용하여 다양한 시간대에서 현재 시간 값을 구할 수 있습니다.

DateTimeOffset 형식을 DateTime 형식으로 변환하기

.NET에서 DateTimeOffset 형식과 DateTime 형식은 모두 날짜와 시간 값을 다룰 수 있습니다. 그러나, DateTimeOffset 형식은 날짜와 시간 값에 UTC 오프셋을 포함하여 저장하고, DateTime 형식은 UTC 시간으로만 저장합니다.

따라서, .NET에서 DateTimeOffset 형식을 DateTime 형식으로 변환하거나, DateTime 형식을 DateTimeOffset 형식으로 변환하는 경우, 시간 값에 대한 UTC 오프셋을 고려하여 변환해야 합니다.

아래는 .NET에서 DateTimeOffset 형식을 DateTime 형식으로 변환하는 방법과, DateTime 형식을 DateTimeOffset 형식으로 변환하는 방법입니다.

DateTimeOffset 형식을 DateTime 형식으로 변환하기

DateTimeOffset 형식을 DateTime 형식으로 변환하려면, DateTime 형식의 FromDateTimeOffset() 메서드를 사용합니다. 이 메서드는 DateTimeOffset 개체를 DateTime 개체로 변환합니다. 아래는 예시 코드입니다.

DateTimeOffset dto = DateTimeOffset.Now;
DateTime dateTime = dto.LocalDateTime;

DateTime 형식을 DateTimeOffset 형식으로 변환하기

DateTime 형식을 DateTimeOffset 형식으로 변환하려면, DateTimeOffset 개체의 FromDateTime() 메서드를 사용합니다. 이 메서드는 DateTime 개체를 DateTimeOffset 개체로 변환하며, 로컬 시간 대신 UTC 시간을 기준으로 변환합니다. 아래는 예시 코드입니다.

DateTime dateTime = DateTime.Now;
DateTimeOffset dto = new DateTimeOffset(dateTime, TimeSpan.Zero);

또는 다음과 같이도 사용 가능합니다.

DateTime dateTime = DateTime.Now;
DateTimeOffset dto = DateTimeOffset.UtcNow.AddTicks(dateTime.Ticks - DateTime.UtcNow.Ticks);

위의 코드에서는 DateTime.UtcNow.Ticks 값을 DateTimeOffset.UtcNow 값에 더하여 DateTime 형식을 DateTimeOffset 형식으로 변환합니다. 이 방법은 .NET 3.5 미만의 버전에서도 사용할 수 있습니다.

이와 같이, .NET에서 DateTimeOffset 형식을 DateTime 형식으로 변환하거나, DateTime 형식을 DateTimeOffset 형식으로 변환하는 방법은 간단합니다. 단, 시간 값의 UTC 오프셋을 고려하여 변환해야 합니다.

DateTimeOffset 구조체 값을 SQL Server에 저장하기

SQL Server의 DATETIMEOFFSET 데이터 형식은 날짜, 시간 및 UTC 오프셋 정보를 함께 저장하는 데이터 형식입니다. 따라서, .NET에서 DateTimeOffset 구조체를 사용하여 날짜와 시간 값을 저장하고, 이를 SQL Server의 DATETIMEOFFSET 형식으로 변환하여 저장할 수 있습니다.

다음은 .NET에서 DateTimeOffset 구조체를 사용하여 SQL Server의 DATETIMEOFFSET 형식으로 데이터를 저장하는 예제입니다.

using System;
using System.Data.SqlClient;

// DateTimeOffset 값 저장 예제
DateTimeOffset dateTimeOffset = 
    new DateTimeOffset(2023, 2, 27, 14, 30, 0, new TimeSpan(9, 0, 0));
string connectionString = 
    "Data Source=(local);Initial Catalog=TestDB;Integrated Security=True;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand(
        "INSERT INTO TestTable (DateTimeOffsetColumn) VALUES (@DateTimeOffset)"
        , connection);
    command.Parameters.AddWithValue("@DateTimeOffset", dateTimeOffset);
    command.ExecuteNonQuery();
}

위 코드에서는 .NET에서 DateTimeOffset 구조체를 사용하여 날짜와 시간 값을 생성하고, 이를 SQL Server의 DATETIMEOFFSET 형식으로 변환하여 데이터베이스에 저장합니다. 데이터베이스에 연결하기 위해 SqlConnection 클래스를 사용하고, SqlCommand 클래스를 사용하여 SQL Server의 INSERT 쿼리를 실행합니다.

SQL Server의 DATETIMEOFFSET 형식은 .NET의 DateTimeOffset 구조체와 유사한 구조를 가지므로, 이를 쉽게 변환하여 저장할 수 있습니다. 이를 활용하여 .NET에서 생성한 DateTimeOffset 값을 SQL Server의 DATETIMEOFFSET 형식으로 저장할 수 있습니다.

SQL Server의 DATETIMEOFFSET 형식을 .NET에서 사용하기

SQL Server의 DATETIMEOFFSET 형식에서 .NET의 DateTimeOffset 또는 DateTime 개체로 변환하는 방법은 다음과 같습니다.

using System;
using System.Data.SqlClient;

// SQL Server에서 DateTimeOffset 값 가져오기 예제
string connectionString = 
    "Data Source=(local);Initial Catalog=TestDB;Integrated Security=True;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand(
        "SELECT DateTimeOffsetColumn FROM TestTable WHERE Id = 1", connection);
    SqlDataReader reader = command.ExecuteReader();
    if (reader.Read())
    {
        DateTimeOffset dateTimeOffset = reader.GetDateTimeOffset(0);
        Console.WriteLine("DateTimeOffset: {0}", dateTimeOffset);
        DateTime dateTime = reader.GetDateTime(0);
        Console.WriteLine("DateTime: {0}", dateTime);
    }
}

위 코드에서는 SqlDataReader 클래스를 사용하여 SQL Server의 DATETIMEOFFSET 형식으로 저장된 값을 .NET의 DateTimeOffset 또는 DateTime 개체로 가져옵니다. SqlDataReader 클래스의 GetDateTimeOffset() 메서드를 사용하여 SQL Server의 DATETIMEOFFSET 값을 DateTimeOffset 개체로 가져오고, GetDateTime() 메서드를 사용하여 SQL Server의 DATETIMEOFFSET 값을 DateTime 개체로 가져옵니다.

이후, 가져온 DateTimeOffset 값과 DateTime 값을 출력합니다.

9. 기타

DateTimeKind 열거형

.NET에서는 DateTimeKind 열거형을 통해 날짜와 시간 값이 어떤 시간대를 기준으로 표현되는지를 지정할 수 있습니다. DateTimeKind은 로컬 시간, 협정 세계시(UTC), 또는 로컬 시간과 UTC의 차이를 나타내는 Local, Utc, Unspecified 세 가지 값 중 하나를 가집니다.

Local 값은 현재 로컬 시간을 나타냅니다. Utc 값은 협정 세계시를 나타냅니다. Unspecified 값은 DateTimeKind을 명시적으로 설정하지 않은 경우의 기본 값으로, 로컬 시간 또는 UTC 시간 중에서 어느 것을 사용할지 명확하지 않을 때 사용됩니다.

DateTime 객체의 Kind 속성을 사용하여 DateTimeKind 값을 가져오거나 설정할 수 있습니다. DateTimeKind 값이 올바르게 설정되지 않은 경우, 예기치 않은 결과가 발생할 수 있으므로 주의가 필요합니다.

다음은 .NET에서 DateTimeKind 열거형을 사용하는 간단한 예제입니다.

using System;

// DateTimeKind.Local 사용 예제
DateTime localTime = DateTime.Now;
Console.WriteLine("로컬 시간: {0}", localTime);
Console.WriteLine("로컬 시간 Kind: {0}", localTime.Kind);

// DateTimeKind.Utc 사용 예제
DateTime utcTime = DateTime.UtcNow;
Console.WriteLine("UTC 시간: {0}", utcTime);
Console.WriteLine("UTC 시간 Kind: {0}", utcTime.Kind);

// DateTimeKind.Unspecified 사용 예제
DateTime unspecifiedTime = new DateTime(2022, 2, 27, 14, 30, 0, DateTimeKind.Unspecified);
Console.WriteLine("Unspecified 시간: {0}", unspecifiedTime);
Console.WriteLine("Unspecified 시간 Kind: {0}", unspecifiedTime.Kind);

위 예제에서는 먼저 DateTime.Now 속성을 사용하여 로컬 시간을 가져옵니다. 이 때, DateTime.Kind 속성을 사용하여 시간 값이 로컬 시간임을 나타내는 DateTimeKind.Local 값을 출력합니다.

그리고 DateTime.UtcNow 속성을 사용하여 UTC 시간을 가져옵니다. 이 때, DateTime.Kind 속성을 사용하여 시간 값이 UTC 시간임을 나타내는 DateTimeKind.Utc 값을 출력합니다.

마지막으로, DateTime 생성자에서 DateTimeKind.Unspecified 값을 지정하여 시간 값을 생성합니다. 이 때, DateTime.Kind 속성을 사용하여 시간 값이 정의되지 않은 상태임을 나타내는 DateTimeKind.Unspecified 값을 출력합니다.

이와 같이, .NET에서는 DateTime.Kind 열거형을 사용하여 시간 값의 종류를 나타내는 것이 가능하며, 이를 활용하여 시간 값이 어느 시간대를 기준으로 하는지 등의 정보를 표시할 수 있습니다.

DateOnly 구조체와 TimeOnly 구조체

.NET 6부터는 DateOnly와 TimeOnly 구조체를 제공합니다. DateOnly는 날짜 값을 표현하는 구조체이며, TimeOnly는 시간 값을 표현하는 구조체입니다.

기존에는 DateTime 구조체를 사용하여 날짜와 시간 값을 모두 표현하였지만, DateOnly와 TimeOnly 구조체를 사용하면 각각 날짜와 시간을 더 직관적으로 다룰 수 있습니다.

DateOnly와 TimeOnly 구조체는 DateTime과 마찬가지로 불변(immutable) 객체로, 값을 변경할 수 없습니다. 구조체에는 각각 Year, Month, Day 또는 Hour, Minute, Second, Millisecond 등의 속성이 제공되며, 이를 사용하여 각각의 구조체의 값을 설정하거나 가져올 수 있습니다.

또한, DateOnly와 TimeOnly 구조체는 TimeSpan 구조체와 연산이 가능합니다. 예를 들어, 두 개의 TimeOnly 구조체의 차이를 구하면 TimeSpan 구조체가 반환되며, 이를 사용하여 시간 간격을 계산할 수 있습니다.

다음은 .NET에서 DateOnly 구조체와 TimeOnly 구조체를 사용하는 간단한 예제입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // DateOnly 구조체 사용 예제
        DateOnly date = new DateOnly(2023, 2, 27);
        Console.WriteLine("DateOnly: {0}", date);

        // TimeOnly 구조체 사용 예제
        TimeOnly time = new TimeOnly(14, 30, 0);
        Console.WriteLine("TimeOnly: {0}", time);
    }
}

위 코드에서는 먼저 DateOnly 구조체를 사용하여 2023년 2월 27일을 나타내는 인스턴스를 생성합니다. DateOnly 구조체는 시간을 제외한 날짜 정보만을 표현하는 구조체로, ToString 메서드를 사용하여 출력하면 "YYYY-MM-DD" 형식으로 출력됩니다.

그리고 TimeOnly 구조체를 사용하여 14시 30분 0초를 나타내는 인스턴스를 생성합니다. TimeOnly 구조체는 날짜를 제외한 시간 정보만을 표현하는 구조체로, ToString 메서드를 사용하여 출력하면 "HH:mm:ss" 형식으로 출력됩니다.

이와 같이, .NET에서는 DateOnly 구조체와 TimeOnly 구조체를 사용하여 날짜와 시간 정보를 구분하여 다룰 수 있으며, 이를 통해 불필요한 정보를 제외하고 필요한 정보만을 다룰 수 있습니다.

다음은 .NET에서 DateOnly 구조체와 TimeOnly 구조체를 사용하여 연산하는 간단한 예제입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // DateOnly 구조체 연산 예제
        DateOnly date1 = new DateOnly(2022, 2, 27);
        DateOnly date2 = new DateOnly(2023, 2, 27);
        TimeSpan timeSpan = date2 - date1;
        Console.WriteLine("날짜 차이: {0} 일", timeSpan.TotalDays);

        // TimeOnly 구조체 연산 예제
        TimeOnly time1 = new TimeOnly(13, 0, 0);
        TimeOnly time2 = new TimeOnly(14, 30, 0);
        TimeSpan timeSpan2 = time2 - time1;
        Console.WriteLine("시간 차이: {0} 분", timeSpan2.TotalMinutes);
    }
}

위 예제에서는 먼저 DateOnly 구조체를 사용하여 날짜 값을 생성하고, 이를 이용하여 날짜 차이를 계산합니다. DateOnly 구조체는 DateTime 구조체와 비슷하지만, 시간 값을 포함하지 않는 구조체입니다. 따라서, 두 DateOnly 구조체 간의 연산은 일(day) 단위로 계산됩니다.

그리고 TimeOnly 구조체를 사용하여 시간 값을 생성하고, 이를 이용하여 시간 차이를 계산합니다. TimeOnly 구조체는 DateTime 구조체와 비슷하지만, 날짜 값을 포함하지 않는 구조체입니다. 따라서, 두 TimeOnly 구조체 간의 연산은 시간(hour), 분(minute), 초(second) 단위로 계산됩니다.

이와 같이, .NET에서는 DateOnly 구조체와 TimeOnly 구조체를 사용하여 날짜와 시간 정보를 구분하여 다룰 수 있으며, 이를 활용하여 필요한 정보만을 추출하거나 연산할 수 있습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com