C#
날짜: 표준 Format Specifier

숫자와 마찬가지로 날짜 Format Specifier는 표준 Format Specifier와 Custom Format Specifier로 나눌 수 있다. 자주 사용되는 날짜 형식은 표준 Format Specifier을 이용하여 표현할 수 있는데, 여기에는 d, D, t, T, g, G, f, F, s, o, u 등등의 매우 다양한 지시어가 있다. 날짜 및 시간 형식은 숫자와 마찬 가지로 Locale 설정에 따라 달라질 수 있다. 즉, 각 국가마다 다른 날짜, 시간을 사용하고 사용자 컴퓨터의 Locale (제어판의 국가 및 언어 설정) 에 따라 다르게 출력될 수 있다. 다음 예제들은 표준 Format Specifier를 사용했을때 어떻게 날짜 및 시간이 다르게 표현되는지 예를 보여준 것이다.

예제

// d : 축약된 날짜 형식
DateTime today = DateTime.Now;
string.Format("{0:d}", today); // 4/14/2014

// D : 긴 날짜 형식
string.Format("{0:D}", today); // Monday, April 14, 2014

// t : 축약된 시간
string.Format("{0:t}", today); // 2:17 PM

// T : 긴 시간 형식
string.Format("{0:T}", today); // 2:18:01 PM

// g : 일반 날 및 시간 (초 생략)
string.Format("{0:g}", today); // 4/14/2014 2:18 PM

// G : 일반 날짜 및 시간
string.Format("{0:G}", today); // 4/14/2014 2:19:11 PM

// f : Full 날짜 및 시간 (초 생략)
string.Format("{0:f}", today);
// Monday, April 14, 2014 2:52 PM

// F : Full 날짜 및 시간
string.Format("{0:F}", today);
// Monday, April 14, 2014 2:52:11 PM

// s : ISO 8601 표준
string.Format("{0:s}", today);
// 2014-04-14T14:53:09

// o : Round-trip 패턴
string.Format("{0:o}", today);
// 2014-04-14T22:54:19.0279340Z

// u : Universal Sortable 패턴
string.Format("{0:u}", today);
// 2014-04-14 15:15:51Z




날짜: Custom Format Specifier

표준 날짜 형식 이외의 날짜 포맷에 대해서는 Custom Format Specifier를 사용할 수 있는데, 이의 지시어로서 아래와 같은 심벌들을 사용할 수 있다. 그리고 이 Custom 날짜 심벌들을 아래 예제와 같이 연월일 시분초를 적절히 조합하여 다양하게 사용할 수 있다.

예제

// 날짜 심벌

M   : 월. 10 이하는 한자리
MM  : 2자리 월
MMM : 축약형 월 이름 (예: APR)
d   : 일. 10 이하는 한자리
dd  : 2자리 일자
ddd : 축약형 요일 이름 (예: Mon)
yy  : 2자리 연도 
yyyy: 4자리 연도 
h   : 시간 (12시간, 10 이하 한자리)
hh  : 2자리 시간 (12시간)
H   : 시간 (24시간, 10 이하 한자리)
HH  : 2자리 시간 (24시간)
m   : 분 (10 이하 한자리)
mm  : 2자리 분
s   : 초 (10 이하 한자리)
ss  : 2자리 초
tt  : AM / PM

// 예제

DateTime today = DateTime.Now;
string.Format("{0:M/d/yyyy}", today);
// 출력 4/15/2014

string.Format("{0:yyyy/MM/dd}", today);
// 출력 2014/04/14

string.Format("{0:d/M/yyyy HH:mm:ss}", today);
// 출력 14/4/2014 14:59:24



ToString()에서의 Format Specifier

숫자 혹은 날짜 타입의 ToString() 메서드는 Format Specifier를 받아들일 수 있다. 즉, DateTime.ToString("s") 와 같이 표준 Format Specifier를 지정할 수도 있고, DateTime.ToString("yyyy/MM/dd") 와 같이 Custom Format Specifier를 지정할 수도 있다. DateTime.ToString()와 같이 파라미터가 없을 경우는 DateTime.ToString("G")와 동일한 포맷이다. 또한 아래 예제에서 처럼 To****String()과 같은 보조 메서드들은 각각 아래와 같은 D,T,d,t 등의 형식과 날짜 포맷이 동일하다.

예제

string s;
DateTime today = DateTime.Now;
s = today.ToString("s");
s = today.ToString("yyyy/MM/dd");

s = today.ToLongDateString();  // D 형식
s = today.ToLongTimeString();  // T 형식
s = today.ToShortDateString(); // d 형식
s = today.ToShortTimeString(); // t 형식




날짜 데이타를 문자열로 Transfer해야 할 때

날짜 데이타를 문자열로 다른 국가 혹은 다른 시스템으로 Transfer 해야 할 때 주의해야 할 점이 있다. 한 지역 혹은 한 시스템의 문자열 날짜 포맷이 다른 시스템으로 전송되었을 때, 타 시스템은 날짜를 파싱할 수 없을 수도 있으며, 파싱하더라도 시간 차이로 인해 다른 시간으로 인식될 수 있다는 점이다. 이러한 오류를 막기 위해 일반적으로 날짜를 UTC 표준 날짜로 변경하고, 이 날짜 데이타를 ISO 8601 포맷으로 변경하여 타 시스템에 전송하는 것이 안전하다.
C# .NET에서 이를 구현하는 방법은 여러가지가 있을 수 있는데, 아래 예제는 서로 다른 몇 가지 방식을 예로 들고 있다. 현재 UTC 시간은 DateTime.UtcNow 속성에서 구할 수 있고, 특정 DateTime 변수의 로컬 타임은 DateTime의 ToUniversalTime() 메서드를 사용하여 상응하는 UTC 시간을 구할 수 있다.
아래 코드에서 방법 1은 표준 Format Specifier o 를 사용하여 ISO 8601 형식으로 밀리초 단위도 함께 포함하는 결과를 출력한다. 방법2는 표준 Format Specifier s 를 사용하여 ISO 8601 형식으로 초 단위까지 결과를 출력한다. 방법3은 Custom Format Specifier 를 사용하여 마찬가지로 ISO 8601 형식으로 초 단위까지 결과를 출력한다. 모든 출력 문자열의 마지막에는 Z가 표시되어 있는데, 이는 해당 시간이 UTC 시간임을 표시한다. 만약 이것이 생략되면 로컬타임으로 인식하게 된다.


예제

DateTime today = DateTime.Now;
DateTime utcTime = today.ToUniversalTime();

// 방법 1
string s = DateTime.UtcNow.ToString("o");
// 출력: 2014-04-14T23:05:03.5243772Z

// 방법 2
s = DateTime.UtcNow.ToString("s", 
    System.Globalization.CultureInfo.InvariantCulture) + "Z";
// 출력: 2014-04-14T23:05:03Z

// 방법 3
s = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
// 출력: 2014-04-14T23:05:03Z




본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.




Comment lovendon@*** 5/13/2015 4:55:37 AM
Comment admin@*** 5/13/2015 9:58:19 AM
Comment be_victorious@*** 8/3/2020 12:47:22 AM
Comment admin@*** 8/4/2020 2:35:57 AM