使用Temporal全局对象即将提出的Temporal.Calendar,下面的短函数在日历日期(Javascript中识别的18个日历(之间进行转换。
目前,Temporal.Calendar为其他Calendar返回的输出日期的格式(示例(为:'2022-02-25[u-ca=persian]'
如何避免使用toString().split("[")[0])
获取没有后缀[u-ca=CalendarName]
的日历日期,因为Intl.DateTimeFormat()
无法识别后缀
<script type='module'>
// ====== load Temporray polyfill (not needed after full Temporal implementation) ========
import * as TemporalModule from 'https://cdn.jsdelivr.net/npm/@js-temporal/polyfill@0.3.0/dist/index.umd.js'
//=====================================================================
// Y,M,D are the date to convert from
// options as in Intl.DateTimeFormat() with additional 'from' and 'locale'
// 'from': calendar name to convert from
// 'locale' the locale to use (default 'en')
// 'calendar': calendar to convert to
// All other options as in Intl.DateTimeFormat()
//---------------------------------------
function dateToCalendars(Y, M, D, op={}) {
return new Intl.DateTimeFormat(op.locale??="en",op).format(new Date(temporal.Temporal.PlainDateTime.from({year:Y,month:M,day:D,calendar:op.from??= "gregory"}).toString().split("[")[0]));
}
//---------------------------------------
//===============================
// Example Test Cases
//===============================
console.log(dateToCalendars(2022,2,25)); // default Gregory
// full format Gregory
console.log(dateToCalendars(2022,2,25, {dateStyle: "full"}));
// from Persian to Gregory in full format
console.log(dateToCalendars(1400,12,6,{from: 'persian', dateStyle: "full"}));
// from Persian to Gregory in full format in 'fa' locale
console.log(dateToCalendars(1400,12,6,{from: 'persian', dateStyle: "full", locale: "fa"}));
// from Persian to Islamic in full format in 'fa' locale
console.log(dateToCalendars(1400,12,6,{from: 'persian', calendar: 'islamic', dateStyle:"full", locale: "fa"}));
// from Islamic to Gregory full format (default 'en' locale)
console.log(dateToCalendars(1443,7,24,{from:"islamic", dateStyle:"full"}));
// from Hebrew to Islamic in full format
console.log(dateToCalendars(5782,6,24,{from: 'hebrew', calendar:"islamic", dateStyle:"full"}));
// from Hebrew to Islamic in full format in 'ar' locale
console.log(dateToCalendars(5782,6,24,{from: 'hebrew', calendar:"islamic", dateStyle:"full", locale: 'ar'}));
// from Hebrew to Persian in full format
console.log(dateToCalendars(5782,6,24,{from: 'hebrew', calendar:"persian", dateStyle:"full"}));
// from Hebrew to Gregory in full format in 'he' locale
console.log(dateToCalendars(5782,6,24,{from: 'hebrew', dateStyle:"full", locale: 'he'}));
</script>
您可以将Temporal.PlainDateTime对象直接传递给Intl.DateTimeFormat,也可以使用Temporal.Calendar.protype.toLocaleString((间接传递。这将使您不必拆分字符串来移除方括号。
(一个很好的经验法则是,如果你发现自己使用任何Temporal对象的toString((输出进行字符串操作,或者使用new Date()
,这可能表明你应该使用Temporal方法。(
需要注意的一点是,您必须确保区域设置的日历与您正在格式化的日期的日历相匹配。不能使用toLocaleString((或Intl.DateTimeFormat进行日历转换(除非它来自ISO 8601日历(。因此,您应该使用withCalendar((方法将日期转换为要输出的日历,并确保Intl选项中的日历与之匹配。
这是我尝试这样一个功能:
function dateToCalendars(year, month, day, op = {}) {
const fromCalendar = op.from ?? 'gregory';
const toCalendar = op.calendar ?? fromCalendar;
const date = Temporal.PlainDate.from({ year, month, day, calendar: fromCalendar })
.withCalendar(toCalendar);
return date.toLocaleString(op.locale ?? 'en', { ...op, calendar: toCalendar });
}