그레고리력이 아닌 달력에서 연도와 연대를 표시하는 방법은 무엇인가요?

Intl.DateTimeFormat의 calendar 및 era 옵션을 사용하여 이슬람력, 히브리력, 중국력, 페르시아력 및 기타 달력 시스템의 연도와 연대를 표시하세요

소개

그레고리력은 단일 시작점부터 연도를 계산하므로 2024년은 간단한 숫자입니다. 다른 달력 시스템은 연도를 다르게 계산합니다. 이슬람력은 서기 622년부터 계산합니다. 히브리력은 수천 년 전의 전통적인 창조 날짜부터 계산합니다. 중국력은 순차적인 숫자 대신 60년 주기의 명명된 연도를 사용합니다.

이러한 서로 다른 계산 시스템은 동일한 시점이 달력마다 다른 연도 표현을 갖는다는 것을 의미합니다. 그레고리력의 2024년 10월 15일은 이슬람력으로는 1446년, 히브리력으로는 5785년, 중국력으로는 2024년(甲辰, 갑진)입니다.

JavaScript의 Intl.DateTimeFormat는 모든 달력 체계의 연도와 연호를 표시하는 옵션을 제공합니다. calendar 옵션은 사용할 달력을 선택합니다. yearera 옵션은 연도와 연호의 표시 방식을 제어합니다. 숫자 대신 명명된 연도를 사용하는 달력의 경우 formatToParts() 메서드를 통해 연도 이름과 해당 그레고리력 연도에 모두 접근할 수 있습니다.

달력 시스템마다 연도가 다른 방식

달력 시스템은 세 가지 근본적인 방식에서 차이가 있습니다: 계산을 시작하는 위치, 연도를 번호 매기는 방법, 연대를 사용하는지 여부입니다.

그레고리력은 서기 1년부터 계산을 시작하고 순차적으로 증가합니다. 이슬람력은 서기 622년의 히즈라 1년(AH, After Hijra)부터 시작합니다. 히브리력은 기원전 3761년의 1년부터 시작합니다. 각 달력에는 연도 계산이 시작되는 지점인 고유한 기원이 있습니다.

일부 달력은 영원히 증가하는 순차적인 연도 번호를 사용합니다. 그레고리력, 이슬람력, 히브리력, 페르시아력이 이러한 방식으로 작동합니다. 다른 달력은 연도 이름이 반복되는 주기를 사용합니다. 중국 달력은 60년 주기의 명명된 연도를 사용합니다. 60년이 지나면 주기가 반복됩니다.

시대는 시간을 명명된 기간으로 나눕니다. 그레고리력은 BC와 AD를 사용합니다. 일본 달력은 황실 연호를 사용합니다. 이슬람력과 히브리력은 일반적으로 기원에서 시작된 단일 시대를 사용합니다. 중국 달력은 같은 방식으로 시대를 사용하지 않으며, 대신 주기 내의 명명된 연도에 의존합니다.

이슬람력으로 연도 표시하기

이슬람력은 622년 CE에 무함마드가 메카에서 메디나로 이주한 히즈라부터 연도를 계산합니다. 이슬람력 1년은 그레고리력 622년에 해당합니다. 이슬람력은 음력 월을 사용하여 그레고리력보다 짧은 연도를 만듭니다. 이는 이슬람력 연도가 더 빠르게 진행됨을 의미하며, 현재 그레고리력 2024년일 때 1446년에 도달합니다.

이슬람력은 calendar 옵션에 islamic 값을 사용하거나 로케일 식별자에 유니코드 확장 -u-ca-islamic를 추가하여 지정합니다.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Rabi' II 12, 1446 AH"

연도는 2024년 10월 15일에 해당하는 이슬람력 연도인 1446으로 표시됩니다. 영어로 이슬람 날짜를 표시할 때 시대 "AH"(After Hijra)가 자동으로 나타납니다.

다른 로케일은 해당 관례에 따라 이슬람 날짜를 형식화합니다.

const date = new Date('2024-10-15');

const en = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(en.format(date));
// "Rabi' II 12, 1446 AH"

const ar = new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(ar.format(date));
// "١٢ ربيع الآخر ١٤٤٦ هـ"

아랍어 로케일은 아랍-인도 숫자를 사용하고 월 이름을 아랍어로 표시합니다. 시대 표시는 "هـ"(히즈라의 아랍어 약어)로 변경됩니다.

이슬람력에서 시대 표시 제어하기

era 옵션은 연호 표시기의 표시 여부와 방법을 제어합니다. 이 옵션은 세 가지 값을 허용합니다: 전체 연호 이름을 표시하는 long, 약어를 표시하는 short, 가장 간결한 형식을 표시하는 narrow입니다.

const date = new Date('2024-10-15');

const long = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  era: 'long'
});
console.log(long.format(date));
// "1446 Anno Hegirae"

const short = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  era: 'short'
});
console.log(short.format(date));
// "1446 AH"

const narrow = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  era: 'narrow'
});
console.log(narrow.format(date));
// "1446 A"

long 값은 "Anno Hegirae"(히즈라의 해를 의미하는 라틴어)를 생성합니다. short 값은 "AH"를 생성합니다. narrow 값은 "A"만 생성합니다.

이슬람력 변형

이슬람력에는 서로 다른 계산 방법을 사용하는 여러 변형이 있습니다. JavaScript는 다섯 가지 변형을 지원합니다: islamic, islamic-civil, islamic-tbla, islamic-umalqura, islamic-rgsa.

islamic-umalqura 변형은 천문 관측을 기반으로 하는 사우디아라비아의 공식 달력을 사용합니다. islamic-civil 변형은 29일과 30일이 교대로 반복되는 고정 산술 계산을 사용합니다.

const date = new Date('2024-10-15');

const umalqura = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic-umalqura',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(umalqura.format(date));
// "Rabi' II 12, 1446 AH"

const civil = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic-civil',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(civil.format(date));
// "Rabi' II 11, 1446 AH"

변형들은 월 경계를 결정하기 위해 서로 다른 계산 방법을 사용하기 때문에 동일한 그레고리력 날짜에 대해 다른 일자를 생성할 수 있습니다.

히브리력으로 연도 표시

히브리력은 기원전 3761년의 전통적인 창조 날짜부터 연도를 계산합니다. 이로 인해 히브리 연도는 그레고리 연도보다 훨씬 큽니다. 히브리 연도 5785는 그레고리 연도 2024에 해당합니다.

히브리력은 calendar 옵션에 hebrew 값을 사용하거나 로케일 식별자에 유니코드 확장 -u-ca-hebrew를 추가하여 지정합니다.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Tishrei 13, 5785"

연도는 2024년 10월 15일에 해당하는 히브리 연도인 5785로 표시됩니다. 히브리력은 태음태양력으로, 월은 달을 따르지만 연도는 주기적인 윤달을 통해 태양년과 동기화됩니다.

히브리 로케일의 히브리 날짜는 히브리 숫자와 월 이름을 사용합니다.

const date = new Date('2024-10-15');

const he = new Intl.DateTimeFormat('he-IL', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(he.format(date));
// "י״ג בתשרי ה׳תשפ״ה"

히브리어 로케일은 숫자로 사용되는 히브리 문자를 포함하여 날짜를 완전히 히브리어로 표시합니다.

중국 달력으로 연도 표시하기

중국 달력은 순차적인 연도 번호 대신 60년 주기의 명명된 연도를 사용합니다. 주기의 각 연도는 천간(天干)과 지지(地支)라는 두 글자로 구성된 이름을 가집니다. 2024년은 甲辰(jiǎ-chén)으로, 전통 중국 점성술에서 "목룡"을 의미합니다.

중국 달력은 명명된 연도를 사용하기 때문에 이를 표시하려면 순차적인 연도 번호를 사용하는 달력과 다른 처리가 필요합니다.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Ninth Month 13, 2024(jiǎ-chén)"

형식화된 출력에는 그레고리력 연도 2024와 괄호 안의 연도 이름 "jiǎ-chén"이 모두 포함됩니다. 이러한 이중 표현은 사용자가 순환 연도 이름과 해당 그레고리력 연도를 모두 이해하는 데 도움이 됩니다.

중국어 로케일의 중국 날짜는 한자를 사용하여 표시됩니다.

const date = new Date('2024-10-15');

const zh = new Intl.DateTimeFormat('zh-CN', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(zh.format(date));
// "2024甲辰年九月十三"

중국어 로케일은 한자를 사용하여 연도 이름을 표시합니다. 형식은 연도 이름을 날짜 문자열에 자연스럽게 통합합니다.

연도 이름 및 관련 연도 추출하기

명명된 연도를 사용하는 달력은 두 가지 정보를 제공합니다: 주기 내의 연도 이름과 해당하는 그레고리력 연도입니다. formatToParts() 메서드는 이를 별도의 부분으로 분리합니다.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('zh-CN', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

const parts = formatter.formatToParts(date);
console.log(parts);

parts 배열에는 두 개의 관련 항목이 포함됩니다:

[
  { type: 'relatedYear', value: '2024' },
  { type: 'yearName', value: '甲辰' },
  // ... other parts
]

relatedYear 부분에는 네 자리 그레고리력 연도가 포함됩니다. yearName 부분에는 순환 연도 이름이 포함됩니다. 이러한 분리를 통해 사용자 정의 형식에서 둘 중 하나 또는 둘 다를 사용할 수 있습니다.

이러한 부분을 추출하여 사용자 정의 날짜 표시를 만들 수 있습니다.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('zh-CN', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

const parts = formatter.formatToParts(date);
const yearName = parts.find(p => p.type === 'yearName')?.value;
const relatedYear = parts.find(p => p.type === 'relatedYear')?.value;

console.log(`Year name: ${yearName}`);
// "Year name: 甲辰"

console.log(`Gregorian year: ${relatedYear}`);
// "Gregorian year: 2024"

이 기법은 명명된 연도나 주기를 사용하는 모든 달력에서 작동합니다.

페르시아 달력으로 연도 표시하기

페르시아력(태양 히즈라력)은 이슬람력과 동일한 기원인 서기 622년의 히즈라부터 연도를 계산합니다. 그러나 페르시아력은 음력 월 대신 태양력 월을 사용하여 구조상 그레고리력과 더 유사합니다.

페르시아력은 calendar 옵션에 persian 값을 사용하거나 로케일 식별자에 유니코드 확장 -u-ca-persian를 추가하여 지정합니다.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'persian',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Mehr 24, 1403 AP"

연도는 2024년 10월 15일에 해당하는 페르시아력 연도인 1403으로 표시됩니다. 영어 형식에서는 "AP"(Anno Persico) 연호가 나타납니다.

페르시아 로케일의 페르시아 날짜는 페르시아 숫자와 월 이름을 사용합니다.

const date = new Date('2024-10-15');

const fa = new Intl.DateTimeFormat('fa-IR', {
  calendar: 'persian',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(fa.format(date));
// "۲۴ مهر ۱۴۰۳ ه‍.ش."

페르시아 로케일은 페르시아어(파르시어) 문자와 숫자를 사용하여 날짜를 표시합니다. 연호 표시 "ه‍.ش."는 태양 히즈라 연호의 페르시아어 약어입니다.

달력 및 연호 옵션 결합

calendarera 옵션을 결합하여 다양한 달력 시스템에서 연도와 연대가 표시되는 방식을 정확하게 제어할 수 있습니다. 이 조합을 통해 날짜 형식을 정밀하게 제어할 수 있습니다.

const date = new Date('2024-10-15');

const gregorian = new Intl.DateTimeFormat('en-US', {
  calendar: 'gregory',
  year: 'numeric',
  month: 'long',
  era: 'short'
});
console.log(gregorian.format(date));
// "October 2024 AD"

const islamic = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  era: 'short'
});
console.log(islamic.format(date));
// "Rabi' II 1446 AH"

const hebrew = new Intl.DateTimeFormat('en-US', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  era: 'short'
});
console.log(hebrew.format(date));
// "Tishrei 5785"

그레고리력 및 이슬람력 날짜는 era 옵션이 설정되어 있기 때문에 연대 표시기를 표시합니다. 히브리력 날짜는 이 형식에서 연대 표시기를 표시하지 않습니다. 히브리력 형식에서는 일반적으로 이를 생략하기 때문입니다.

로케일과 달력을 혼합하여 다른 문화의 달력을 사용하여 한 언어로 날짜를 표시할 수도 있습니다.

const date = new Date('2024-10-15');

const englishIslamic = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(englishIslamic.format(date));
// "Rabi' II 12, 1446 AH"

const arabicIslamic = new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(arabicIslamic.format(date));
// "١٢ ربيع الآخر ١٤٤٦ هـ"

두 포매터 모두 이슬람력을 사용하지만, 영어 로케일은 영어 월 이름과 라틴 숫자를 생성하는 반면 아랍어 로케일은 아랍어 월 이름과 아랍-인도 숫자를 생성합니다.

여러 달력에서 연도 표시

국제 사용자를 대상으로 하는 애플리케이션은 동일한 날짜를 여러 달력 체계로 표시해야 하는 경우가 많습니다. 여러 포매터를 생성하여 병렬 표현을 표시할 수 있습니다.

const date = new Date('2024-10-15');

const calendars = [
  { name: 'Gregorian', calendar: 'gregory' },
  { name: 'Islamic', calendar: 'islamic' },
  { name: 'Hebrew', calendar: 'hebrew' },
  { name: 'Persian', calendar: 'persian' }
];

calendars.forEach(cal => {
  const formatter = new Intl.DateTimeFormat('en-US', {
    calendar: cal.calendar,
    year: 'numeric',
    month: 'long',
    day: 'numeric'
  });
  console.log(`${cal.name}: ${formatter.format(date)}`);
});

결과:

Gregorian: October 15, 2024
Islamic: Rabi' II 12, 1446 AH
Hebrew: Tishrei 13, 5785
Persian: Mehr 24, 1403 AP

각 달력은 고유한 연도 계산 체계와 연호 표시를 사용하여 동일한 시점을 나타냅니다.

일반적인 사용 사례

국제 애플리케이션은 사용자가 기대하는 달력 체계로 날짜를 표시해야 합니다. 이슬람 금융 애플리케이션은 이슬람력을 사용하여 거래 날짜를 표시합니다.

const transactionDate = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic-umalqura',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});

console.log(`Transaction date: ${formatter.format(transactionDate)}`);
// "Transaction date: ١٢ ربيع الآخر ١٤٤٦ هـ"

종교 달력은 휴일과 기념일의 날짜를 결정합니다. 유대교 달력 애플리케이션은 휴일에 대한 히브리 날짜를 표시합니다.

const roshHashanah2024 = new Date('2024-10-03');

const formatter = new Intl.DateTimeFormat('he-IL', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(`Rosh Hashanah: ${formatter.format(roshHashanah2024)}`);
// "Rosh Hashanah: א׳ בתשרי ה׳תשפ״ה"

역사 애플리케이션은 당시 사용된 달력 체계로 날짜를 표시합니다. 고대 페르시아에 관한 애플리케이션은 페르시아력을 사용하여 날짜를 표시합니다.

const historicalDate = new Date('2024-03-20');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'persian',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'long'
});

console.log(`Persian New Year: ${formatter.format(historicalDate)}`);
// "Persian New Year: Farvardin 1, 1403 Anno Persico"

요약

그레고리력이 아닌 달력은 서로 다른 시작점에서 연도를 계산하고 다른 번호 체계를 사용합니다. 이슬람력은 서기 622년부터 계산하며 현재 1446년경을 표시합니다. 히브리력은 기원전 3761년부터 계산하며 5785년경을 표시합니다. 중국력은 순차적 숫자 대신 60년 주기의 명명된 연도를 사용합니다.

JavaScript의 Intl.DateTimeFormatcalendar 옵션을 통해 이러한 달력 시스템을 지원합니다. 값에는 islamic, hebrew, chinese, persian 등이 포함됩니다. year 옵션은 연도 표시 여부를 제어하고, era 옵션은 연대 표시기의 표시 여부와 표시 방식을 제어합니다.

명명된 연도를 사용하는 달력은 formatToParts()를 통해 두 가지 정보를 제공합니다. yearName 부분에는 순환 연도 이름이 포함됩니다. relatedYear 부분에는 해당 그레고리력 연도가 포함됩니다. 이를 통해 애플리케이션은 두 값 중 하나 또는 둘 다를 표시할 수 있습니다.

서로 다른 로케일은 동일한 달력을 다른 방식으로 형식화합니다. 이슬람력은 영어에서는 라틴 숫자로, 아랍어에서는 아라비아-인도 숫자로 표시됩니다. 형식화는 달력의 연도 번호 체계를 유지하면서 로케일 규칙에 자동으로 적응합니다.