다음을 통해 공유


서식 파일 및 패턴을 사용하여 날짜 및 시간 서식 지정

사용자 지정 템플릿 및 패턴이 있는 Windows.Globalization.DateTimeFormatting 네임스페이스의 클래스를 사용하여 날짜와 시간을 원하는 형식으로 정확하게 표시합니다.

소개

DateTimeFormatter 클래스는 전 세계 언어 및 지역에 대한 날짜 및 시간의 형식을 올바르게 지정하는 다양한 방법을 제공합니다. 연도, 월, 일 등에 표준 형식을 사용할 수 있습니다. 또는 "longdate" 또는 "month day"와 같은 DateTimeFormatter 생성자의formatTemplate 인수에 서식 템플릿을 전달할 수 있습니다.

그러나 표시하려는 DateTime 개체의 구성 요소의 순서와 형식을 더 자세히 제어하려는 경우 형식 패턴을 생성자의 formatTemplate 인수에 전달할 수 있습니다. 형식 패턴은 사용자가 선택한 사용자 지정 형식으로 표시하기 위해 DateTime 개체의 개별 구성 요소(예: 월 이름 또는 연도 값)를 가져올 수 있는 특수 구문을 사용합니다. 또한 패턴은 다른 언어 및 지역에 맞게 지역화할 수 있습니다.

메모 이는 형식 패턴에 대한 개요일 뿐입니다. 서식 템플릿과 형식 패턴에 관한 더 자세한 설명은 DateTimeFormatter 클래스의 설명 섹션을 참조하세요.

형식 템플릿과 서식 패턴의 차이점

형식 템플릿은 문화권에 구애받지 않은 형식 문자열입니다. 따라서 서식 템플릿을 사용하여 DateTimeFormatter를 생성하는 경우, 포맷터는 현재 언어에 맞는 순서로 서식 구성 요소를 표시합니다. 반대로 형식 패턴은 문화권에 따라 다릅니다. 형식 패턴을 사용하여 DateTimeFormatter 를 생성하는 경우 포맷터는 지정된 대로 패턴을 정확하게 사용합니다. 따라서 패턴이 문화권 전체에서 반드시 유효하지는 않습니다.

예제를 사용하여 이러한 차이점을 설명해 보겠습니다. 간단한 서식 템플릿(패턴 아님)을 DateTimeFormatter 생성자에 전달합니다. "이것은 '월 일' 형식 템플릿입니다."

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");

이렇게 하면 현재 컨텍스트의 언어 및 지역 값을 기반으로 포맷터가 만들어집니다. 서식 서식 파일의 구성 요소 순서는 중요하지 않습니다. 포맷터는 현재 언어에 대해 올바른 순서로 표시합니다. 따라서 영어(미국)의 경우 "1월 1일", 프랑스어(프랑스)의 경우 "1 janvier", 일본어의 경우 "1월 1일"을 표시합니다.

반면에 형식 패턴은 문화권에 따라 다릅니다. 서식 파일의 형식 패턴에 액세스해 보겠습니다.

IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;

이렇게 하면 런타임 언어 및 지역에 따라 다른 결과가 생성됩니다. 다른 지역에서는 추가 문자 및 간격을 포함하거나 사용하지 않고 다양한 순서로 서로 다른 구성 요소를 사용할 수 있습니다.

En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"

위의 예제에서는 문화권에 구애받지 않는 형식 문자열을 입력했고 문화권별 형식 문자열(dateFormatter.Patterns호출할 때 적용된 언어 및 영역의 함수)을 다시 얻었습니다. 따라서 문화권별 형식 패턴에서 DateTimeFormatter 를 생성하는 경우 특정 언어/지역에 대해서만 유효합니다.

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");

위의 포맷터는 대괄호 안의 개별 구성 요소에 대한 문화권별 값을 반환합니다 {}. 그러나 형식 패턴의 구성 요소 순서는 고정되지 않습니다. 당신은 당신이 요구하는 것을 정확하게 얻습니다. 그러나 이는 문화적으로 적절하지 않을 수도 있습니다. 이 포맷터는 영어(미국)에는 유효하지만 프랑스어(프랑스) 또는 일본어에는 유효하지 않습니다.

En-US: January 1
Fr-FR: janvier 1 (inappropriate for France; non-standard order)
Ja-JP: 1月1 (inappropriate for Japan; the day symbol 日 is missing)

또한 현재 올바른 패턴은 나중에 올바르지 않을 수 있습니다. 국가 또는 지역은 달력 시스템을 변경하여 형식 템플릿을 변경할 수 있습니다. Windows는 형식 템플릿을 기반으로 포맷터의 출력을 업데이트하여 이러한 변경 내용을 수용합니다. 따라서 이러한 조건 중 하나 이상에서만 패턴 구문을 사용해야 합니다.

  • 특정 형식의 출력에 종속되지 않습니다.
  • 일부 문화권별 표준을 따르는 형식은 필요하지 않습니다.
  • 패턴이 문화권 간에 변하지 않도록 의도합니다.
  • 실제 형식 패턴 문자열 자체를 지역화하려고 합니다.

다음은 서식 파일과 서식 패턴 간의 차이점에 대한 요약입니다.

서식 파일(예: "월 일")

  • 월, 일 등의 값을 순서에 따라 포함하는 DateTime 형식의 추상화된 표현입니다.
  • Windows에서 지원하는 모든 언어 지역 값에서 유효한 표준 형식을 반환하도록 보장됩니다.
  • 지정된 언어 지역에 대해 문화적으로 적절한 형식의 문자열을 제공하도록 보장됩니다.
  • 구성 요소의 모든 조합이 유효한 것은 아닙니다. 예를 들어 "dayofweek day"는 유효하지 않습니다.

서식 패턴(예: "{month.full} {day.integer}"

  • 전체 월 이름, 공백, 일 정수, 해당 순서 또는 지정한 특정 형식 패턴을 나타내는 명시적으로 정렬된 문자열입니다.
  • 언어 지역 쌍의 유효한 표준 형식에 해당하지 않을 수 있습니다.
  • 문화적으로 적절하다고 보장되지 않습니다.
  • 구성 요소의 조합은 순서에 따라 지정할 수 있습니다.

예시

현재 월과 요일을 현재 시간과 함께 특정 형식으로 표시하려고 하는 경우를 가정해 보겠습니다. 예를 들어, 미국 영어 사용자가 다음과 같은 내용을 보도록 할 수 있습니다.

June 25 | 1:38 PM

날짜 부분은 "월 일" 서식 파일에 해당하며 시간 부분은 "시간 분" 서식 파일에 해당합니다. 따라서 관련 날짜 및 시간 형식 템플릿에 대한 포맷터를 생성한 다음 지역화 가능한 형식 문자열을 사용하여 출력을 함께 연결할 수 있습니다.

var dateToFormat = System.DateTime.Now;
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");

var date = dateFormatter.Format(dateToFormat);
var time = timeFormatter.Format(dateToFormat);

string output = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), date, time);

CustomDateTimeFormatString 는 리소스 파일(.resw)에서 지역화 가능한 리소스를 참조하는 리소스 식별자입니다. 영어(미국)의 기본 언어의 경우, "{0} | {1}"로 값을 설정하고, “{0}”는 날짜이고, “{1}”는 시간임을 나타내는 주석을 함께 넣습니다. 이렇게 하면 번역기에서 필요에 따라 서식 항목을 조정할 수 있습니다. 예를 들어 일부 언어 또는 지역에서 시간이 날짜보다 먼저 오는 것이 더 자연스러운 경우, 항목의 순서를 변경할 수 있습니다. 또는 "|"을(를) 다른 구분 기호 문자로 바꿀 수 있습니다.

이 예제를 구현하는 또 다른 방법은 두 포맷터를 쿼리하여 해당 형식 패턴을 연결한 다음 결과 형식 패턴에서 세 번째 포맷터를 생성하는 것입니다.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");

string dateFormatterPattern = dateFormatter.Patterns[0];
string timeFormatterPattern = timeFormatter.Patterns[0];

string pattern = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), dateFormatterPattern, timeFormatterPattern);

var patternFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(pattern);

string output = patternFormatter.Format(System.DateTime.Now);

중요 API