날짜: 표준 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
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.