비 그레고리안 달력에서 연도와 시대를 어떻게 표시하나요?
Intl.DateTimeFormat의 calendar 및 era 옵션을 사용하여 이슬람력, 히브리력, 중국력, 페르시아력 및 기타 달력 시스템의 연도와 시대를 표시합니다
소개
그레고리안 달력은 단일 시작점부터 연도를 계산하여 2024년이라는 명확한 숫자가 됩니다. 다른 달력 시스템은 연도를 다르게 계산합니다. 이슬람력은 서기 622년부터 계산합니다. 히브리력은 수천 년 전의 전통적인 창조일부터 계산합니다. 중국 달력은 연속적인 숫자 대신 60년 주기의 이름이 붙은 연도를 사용합니다.
이러한 다양한 계산 시스템은 동일한 시간이 달력마다 다른 연도 표현을 갖는다는 것을 의미합니다. 그레고리안 달력의 2024년 10월 15일은 이슬람력으로는 1446년, 히브리력으로는 5785년, 중국 달력으로는 2024년(甲辰, 갑진)입니다.
JavaScript의 Intl.DateTimeFormat은 모든 달력 시스템의 연도와 시대를 표시하는 옵션을 제공합니다. calendar 옵션은 사용할 달력을 선택합니다. year와 era 옵션은 연도와 시대 표시 방법을 제어합니다. 숫자 대신 이름이 붙은 연도를 사용하는 달력의 경우, formatToParts() 메서드는 연도 이름과 해당 그레고리안 연도에 모두 접근할 수 있게 해줍니다.
달력 시스템별 연도 차이
달력 시스템은 세 가지 기본적인 방식에서 차이가 있습니다: 계산을 시작하는 지점, 연도를 번호 매기는 방법, 그리고 시대를 사용하는지 여부입니다.
그레고리안 달력은 서기 1년부터 계산을 시작하여 순차적으로 증가합니다. 이슬람력은 서기 622년에 해당하는 1 AH(히즈라 이후)부터 시작합니다. 히브리력은 기원전 3761년에 해당하는 1년부터 시작합니다. 각 달력은 연도 계산이 시작되는 고유한 기원점을 가지고 있습니다.
일부 달력은 영원히 증가하는 순차적인 연도 번호를 사용합니다. 그레고리안, 이슬람, 히브리, 페르시아 달력이 이런 방식으로 작동합니다. 다른 달력은 연도 이름이 반복되는 주기를 사용합니다. 중국 달력은 60년 주기의 이름이 붙은 연도를 사용합니다. 60년 후에는 주기가 반복됩니다.
시대는 시간을 명명된 기간으로 나눕니다. 그레고리안 달력은 BC와 AD를 사용합니다. 일본 달력은 황실 시대 이름을 사용합니다. 이슬람력과 히브리력은 일반적으로 그들의 기원점에서 시작된 단일 시대를 사용합니다. 중국 달력은 같은 방식으로 시대를 사용하지 않고, 대신 주기 내의 이름이 붙은 연도에 의존합니다.
이슬람력으로 연도 표시하기
이슬람력은 무함마드가 메카에서 메디나로 이주한 히즈라(Hijra)를 기점으로 연도를 계산합니다. 이슬람력 1년은 그레고리력 622년에 해당합니다. 이슬람력은 태음월을 사용하기 때문에 그레고리력보다 1년이 짧습니다. 이로 인해 이슬람력은 더 빠르게 진행되어, 그레고리력 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"
연도는 1446으로 표시되며, 이는 2024년 10월 15일에 해당하는 이슬람력 연도입니다. 영어로 이슬람력 날짜를 표시할 때는 "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"
연도는 5785로 표시되며, 이는 2024년 10월 15일에 해당하는 히브리력 연도입니다. 히브리력은 태음태양력으로, 월은 달의 주기를 따르지만 주기적인 윤달을 통해 연도는 태양년과 동기화됩니다.
히브리어 로케일의 히브리 날짜는 히브리 숫자와 월 이름을 사용합니다.
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);
부분 배열에는 두 가지 관련 항목이 포함됩니다:
[
{ type: 'relatedYear', value: '2024' },
{ type: 'yearName', value: '甲辰' },
// ... 기타 부분
]
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 CE의 히즈라부터 연도를 계산합니다. 그러나 페르시아 달력은 음력 월 대신 태양력 월을 사용하여 구조적으로 그레고리안 달력과 더 유사합니다.
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"
연도는 1403으로 표시되며, 이는 2024년 10월 15일에 해당하는 페르시아 연도입니다. 영어 형식에서는 "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));
// "۲۴ مهر ۱۴۰۳ ه.ش."
페르시아 로케일은 페르시아(파르시) 문자와 숫자를 사용하여 날짜를 표시합니다. 시대 표시기 "ه.ش."는 태양력 히즈라 시대의 페르시아 약어입니다.
달력 및 시대 옵션 결합하기
다양한 달력 시스템에서 연도와 시대가 표시되는 방식을 정확하게 제어하기 위해 calendar와 era 옵션을 결합할 수 있습니다. 이 조합을 통해 날짜 형식을 정밀하게 제어할 수 있습니다.
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년 주기의 이름이 붙은 연도를 사용합니다.
자바스크립트의 Intl.DateTimeFormat은 calendar 옵션을 통해 이러한 달력 시스템을 지원합니다. 값에는 islamic, hebrew, chinese, persian 등이 포함됩니다. year 옵션은 연도 표시 여부를 제어하고, era 옵션은 시대 표시기의 표시 여부와 방법을 제어합니다.
이름이 붙은 연도를 사용하는 달력은 formatToParts()를 통해 두 가지 정보를 제공합니다. yearName 부분에는 순환적 연도 이름이 포함됩니다. relatedYear 부분에는 해당하는 그레고리안 연도가 포함됩니다. 이를 통해 애플리케이션은 두 값 중 하나 또는 둘 다 표시할 수 있습니다.
서로 다른 로케일은 동일한 달력을 다른 방식으로 형식화합니다. 이슬람력은 영어로는 라틴 숫자로, 아랍어로는 아랍-인도 숫자로 표시됩니다. 형식화는 달력의 연도 번호 체계를 유지하면서 로케일 규칙에 자동으로 적응합니다.