如何在 Javascript 中将波斯 (Jalali) 日期转换为其他 18 个日历日期,无需外部库或复杂的天文方程

Moh*_*fei 8 javascript datetime calendar date jalali-calendar

TL;DR,要求是能够采用波斯 (Jalali) 日期(也称为波斯阳历回历) Esfand 19, 1400(即将"12/19/1400"其转换为其他日历(格里高利历、伊斯兰历、中国历、希伯来历等),而无需使用外部库或复杂的天文方程。并且无需使用 Javascript 中即将实现的新日期时间 API

Javascript 内置方法Intl.DateTimeFormat()将公历日期转换为各种日历日期(18 个世界日历),包括输出字符串的格式。

但是,截至今天(2022 年 3 月),Javascript 不提供用于反向操作的内置方法,即将波斯日期(和其他日历的日期)转换回公历日期或其他日历。为此,您需要使用外部日期库来进行转换,例如“moment.js”等。

我进行日期转换的方法如下,作为 StackOverflow 推荐的这个问题的答案:我可以回答我自己的问题吗?

Moh*_*fei 6

下面的简短 Javascript 函数不使用外部库,并提供将波斯 (Jalali) 日期(从波斯年 -272,442 AP 到 +275,139 AP )转换为以下 18 个 Javascript 日历中的任何一个的工具,并提供格式化结果输出的选项:

\n

"buddhist", "chinese", "coptic", "dangi", "ethioaa", "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamic-umalqura", "islamic-tbla", "islamic-civil", "islamic-rgsa", "iso8601", "japanese", "persian", "roc", "islamicc".

\n

该方法也不使用复杂的数学或天文公式,仅依赖于 Javascript 内置日历转换算法,而这些算法又基于 ICU 代码 [https://icu.unicode.org/]。

\n

这种方法可确保输出始终准确且完全符合 Javascript 引擎输出。

\n

句法

\n
persianToCalendars(year, month, day, [options])\n
Run Code Online (Sandbox Code Playgroud)\n

Gregorian在最简单的形式中,该函数默认使用 ISO 日期格式将波斯日期转换为日历。

\n

示例:将波斯日期 Esfand 19, 1400(即 12/19/1400)转换为公历。

\n
persianToCalendars(1400,12,19);\n\noutput: 2022-03-10T00:00:00.000Z    // default output Gregorian ISO format\n
Run Code Online (Sandbox Code Playgroud)\n

将波斯日期转换为另一个日历(例如“伊斯兰日历”):

\n
 persianToCalendars(1400,12,19, { toCal: "islamic-umalqura" });\n\n output: 8/7/1443 AH\n
Run Code Online (Sandbox Code Playgroud)\n

要向输出添加格式,请使用\'dateStyle\'JavascriptIntl.DateTimeFormat()方法中的选项。

\n

示例:使用完整的 dateStyle 将波斯日期转换为伊斯兰日期

\n
 persianToCalendars(1400,12,19, { toCal: "islamic-umalqura", dateStyle: "full" });\n\n output: Thursday, Sha\xca\xbbban 7, 1443 AH\n
Run Code Online (Sandbox Code Playgroud)\n

示例:使用波斯语区域设置将波斯语日期转换为希伯来语

\n
 persianToCalendars(1400,12,19, { toCal:"hebrew", dateStyle: "full", locale:"fa"})\n\n output: \xd9\xbe\xd9\x86\xd8\xac\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87 \xdb\xb7 \xd9\x88\xd8\xa7\xd8\xb0\xd8\xa7\xd8\xb1 \xd8\xa7\xd9\x84\xd8\xab\xd8\xa7\xd9\x86\xdb\x8c \xdb\xb5\xdb\xb7\xdb\xb8\xdb\xb2 \xd8\xaa\xd9\x82\xd9\x88\xdb\x8c\xd9\x85 \xd8\xb9\xd8\xa8\xd8\xb1\xdb\x8c\n
Run Code Online (Sandbox Code Playgroud)\n

上述操作可用于所有其他 18 个日历。

\n

一个附加功能是能够将波斯日期格式化为任何可用的日期\'dateStyles\'\'locales\' 无需转换

\n

为此,请指定\'toCal\'topersian

\n

示例:使用波斯语语言环境设置波斯语日期格式

\n
 persianToCalendars(1400,12,19,{toCal:"persian",dateStyle:"full", locale:"fa"}));\n\n output:  \xdb\xb1\xdb\xb4\xdb\xb0\xdb\xb0 \xd8\xa7\xd8\xb3\xd9\x81\xd9\x86\xd8\xaf \xdb\xb1\xdb\xb9, \xd9\xbe\xd9\x86\xd8\xac\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87         // mind the RTL requirements\n
Run Code Online (Sandbox Code Playgroud)\n

示例:在印地语区域设置中设置波斯语日期格式

\n
 persianToCalendars(1400,12,19,{ toCal : "persian", dateStyle : "full", locale : "hi"}));\n\n output: AP \xe0\xa4\x97\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x81\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0, 19 \xe0\xa4\x88\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xab\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x8d 1400\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用 中的所有可用选项Intl.DateTimeFormat()来格式化输出日期。

\n

无效的波斯日期

\n

如果将无效的波斯日期传递给函数,Invalid Persian Date!则会生成错误。

\n

无效的波斯日期是指当月中的日期不正确或者日期或月份不正确的日期。

\n

例如,波斯日期 1400/12/30 无效,因为波斯历的 12 月(“Esfand”月)是 1400 年的 29 天。

\n

未来的 Javascript Temporal API将使这项任务变得更简单。

\n

\r\n
\r\n
persianToCalendars(year, month, day, [options])\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n