如何使用 JavaScript 将公历日期转换为伊斯兰回历日期?
4 回答
function gmod(n,m){
return ((n%m)+m)%m;
}
function kuwaiticalendar(adjust){
var today = new Date();
if(adjust) {
adjustmili = 1000*60*60*24*adjust;
todaymili = today.getTime()+adjustmili;
today = new Date(todaymili);
}
day = today.getDate();
month = today.getMonth();
year = today.getFullYear();
m = month+1;
y = year;
if(m<3) {
y -= 1;
m += 12;
}
a = Math.floor(y/100.);
b = 2-a+Math.floor(a/4.);
if(y<1583) b = 0;
if(y==1582) {
if(m>10) b = -10;
if(m==10) {
b = 0;
if(day>4) b = -10;
}
}
jd = Math.floor(365.25*(y+4716))+Math.floor(30.6001*(m+1))+day+b-1524;
b = 0;
if(jd>2299160){
a = Math.floor((jd-1867216.25)/36524.25);
b = 1+a-Math.floor(a/4.);
}
bb = jd+b+1524;
cc = Math.floor((bb-122.1)/365.25);
dd = Math.floor(365.25*cc);
ee = Math.floor((bb-dd)/30.6001);
day =(bb-dd)-Math.floor(30.6001*ee);
month = ee-1;
if(ee>13) {
cc += 1;
month = ee-13;
}
year = cc-4716;
wd = gmod(jd+1,7)+1;
iyear = 10631./30.;
epochastro = 1948084;
epochcivil = 1948085;
shift1 = 8.01/60.;
z = jd-epochastro;
cyc = Math.floor(z/10631.);
z = z-10631*cyc;
j = Math.floor((z-shift1)/iyear);
iy = 30*cyc+j;
z = z-Math.floor(j*iyear+shift1);
im = Math.floor((z+28.5001)/29.5);
if(im==13) im = 12;
id = z-Math.floor(29.5001*im-29);
var myRes = new Array(8);
myRes[0] = day; //calculated day (CE)
myRes[1] = month-1; //calculated month (CE)
myRes[2] = year; //calculated year (CE)
myRes[3] = jd-1; //julian day number
myRes[4] = wd-1; //weekday number
myRes[5] = id; //islamic date
myRes[6] = im-1; //islamic month
myRes[7] = iy; //islamic year
return myRes;
}
function writeIslamicDate(adjustment) {
var wdNames = new Array("Ahad","Ithnin","Thulatha","Arbaa","Khams","Jumuah","Sabt");
var iMonthNames = new Array("Muharram","Safar","Rabi'ul Awwal","Rabi'ul Akhir",
"Jumadal Ula","Jumadal Akhira","Rajab","Sha'ban",
"Ramadan","Shawwal","Dhul Qa'ada","Dhul Hijja");
var iDate = kuwaiticalendar(adjustment);
var outputIslamicDate = wdNames[iDate[4]] + ", "
+ iDate[5] + " " + iMonthNames[iDate[6]] + " " + iDate[7] + " AH";
return outputIslamicDate;
}
这会将当前计算机日期转换为回历。稍作修改,您就可以实现此代码段将任何日期更改为伊斯兰
document.write(writeIslamicDate(1));
取自本站
如果您只需要从公历日期(米拉迪日期)转换的回历日期,您可以简单地在 javascript 中编写这个等式:
var GregorianYear = (new Date()).getFullYear();
var HijriYear = Math.round((GregorianYear - 622) * (33 / 32));
您可以在母版页的页脚中使用这个简单的公式,例如 كل الحقوق محفوطة لـ ... ©
<script type="text/javascript">document.write((new Date()).getFullYear())</script> م - <script type="text/javascript">var y = (new Date()).getFullYear();var h = Math.round((y - 622) * (33 / 32));document.write(h)</script> هـ
你会得到:كل الحقوق محفوطة لـ ... © 2014 م - 1435 هـ
您还可以使用嵌入在 asp 页面中的 C#:
<%= DateTime.Now.Year %> - <%= Math.Round((DateTime.Now.Year - 622) * 1.03125) %>
将返回:2014 - 1436
最后,如果您需要转换为 UmAlQura 日期,只需尝试这行代码:
let _date = new Date('7/10/2019').toLocaleDateString('ar-SA').format('DD/MM/YYYY');
console.log(_date);
将返回:٧/١١/١٤٤٠هـ
更新(2021-10-11):如果您需要更精确的方程式,您必须通过以下公式知道太阳年的当前日期:
var now = new Date();
var start = new Date(now.getFullYear(), 0, 0);
var diff = now - start;
var oneDay = 1000 * 60 * 60 * 24;
var dayOfYear = Math.floor(diff / oneDay);
然后你可以通过这个公式得到回历年:
HijriYear = ((GregorianYear-621.5643)*365.24225 + dayOfYear) / 354.36707
在哪里 :
365.24225是太阳年的天数。
354.36707是农历年的天数。
621.5643是回历的确切公历日期(回历日期的开始日期)
回历年 = ((2021-621.5643)*365.24225 + 284) / 354.36707 = 1,443.18444
所以当前的回历年是1443通过使用Math.floor(HijriYear)
函数。
您也可以使用分数:
var hijriDayOfYear = (HijriYear - Math.floor(HijriYear)) * 354.36707
0.18444乘以354.36707得到回历中的天数:
0.18444 * 354.36707 = 65.3 : 当前回历年的天数
Math.ceil(hijriDayOfYear / 29.530589) = 3
当前回历月数
Math.floor(hijriDayOfYear % 29.530589) = 6 ± 1
这个回历月的天数
最后总结一下之前的所有内容,只需使用以下 JS 代码:
var now = new Date()
var dayOfYear = Math.floor((new Date() - new Date(now.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
var hijriDate = ((now.getFullYear()-621.5643)*365.24225 + dayOfYear) / 354.36707
var hijriYear = Math.floor(hijriDate)
var hijriMonth = Math.ceil((hijriDate - Math.floor(hijriDate)) * 354.36707 / 29.530589)
var hijriDay = Math.floor((hijriDate - Math.floor(hijriDate)) * 354.36707 % 29.530589)
console.log(`${hijriYear}/${hijriMonth}/${hijriDay}`)
控制台输出样本:1443/3/6
将日期时间转换为回历日期的通用 JavaScript 函数:
function GetHijriDate(dateTime) {
var dayOfYear = Math.floor((dateTime - new Date(dateTime.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
var hijriDate = ((dateTime.getFullYear() - 621.5643) * 365.24225 + dayOfYear) / 354.36707
var hijriYear = Math.floor(hijriDate)
var hijriMonth = Math.ceil((hijriDate - Math.floor(hijriDate)) * 354.36707 / 29.530589)
var hijriDay = Math.floor((hijriDate - Math.floor(hijriDate)) * 354.36707 % 29.530589)
return [hijriYear, hijriMonth , hijriDay]
}
在 C# 中:
/// <summary>
/// Gets the hijri date.
/// </summary>
/// <param name="date">The date.</param>
/// <returns></returns>
public static int[] GetHijriDate(DateTime date)
{
var yearOfHijra = 621.5643f;
var daysInSolarYear = 365.24225f;
var daysInLunarYear = 354.36707f;
var daysInLunarMonth = 29.53058f;
var hijriDate = ((date.Year - yearOfHijra) * daysInSolarYear + date.DayOfYear) / daysInLunarYear;
var hijriYear = (int)Math.Floor(hijriDate);
var hijriMonth = (int)Math.Ceiling((hijriDate - Math.Floor(hijriDate)) * daysInLunarYear / daysInLunarMonth);
var hijriDay = (int)Math.Floor((hijriDate - Math.Floor(hijriDate)) * daysInLunarYear % daysInLunarMonth);
int[] hijriDateRes = new int[3];
hijriDateRes[0] = hijriYear;
hijriDateRes[1] = hijriMonth;
hijriDateRes[2] = hijriDay;
return hijriDateRes;
}
或者简单地说:
console.log(new Date().toLocaleDateString('ar-SA'))
'٥/٣/١٤٤٣ هـ'
查看我的图书馆hijrah-date,它是 Hijrah 日历系统中的 Javascript 日期。
它还支持 Hijrah 到 Gregorian 和 Gregorian 到 Hijrah 的转换。除了日期格式。
最安全的是使用内置的 javascript Intl.DateTimeFormat() 构造函数。
这是今天日期的伊斯兰回历日历中 4 种输出格式的示例。
还有以不同格式分别提取年份和月份的示例。
let myFormat = 'en-u-ca-islamic-umalqura-nu-latn'; // use islamic-umalqura calendar (most modern)
let myDate = new Date(Date.now()); // today's date
let output = new Intl.DateTimeFormat(myFormat,{dateStyle:'full'}).format(myDate);
console.log("Full format : "+output);
output = new Intl.DateTimeFormat(myFormat,{dateStyle:'long'}).format(myDate);
console.log("Long format : "+output);
output = new Intl.DateTimeFormat(myFormat,{dateStyle:'medium'}).format(myDate);
console.log("Medium format : "+output);
output = new Intl.DateTimeFormat(myFormat,{dateStyle:'short'}).format(myDate);
console.log("Short format (m/d/yyyy): "+output);
console.log("=".repeat(50));
let yearFull = new Intl.DateTimeFormat(myFormat,{year:'numeric'}).format(myDate);
console.log("The full year : "+yearFull);
console.log("The year number : " +(+yearFull.split(" ")[0]));
let monthLong = new Intl.DateTimeFormat(myFormat,{month:'long'}).format(myDate);
let monthShort = new Intl.DateTimeFormat(myFormat,{month:'short'}).format(myDate);
let monthNum = new Intl.DateTimeFormat(myFormat,{month:'numeric'}).format(myDate);
let month2 = new Intl.DateTimeFormat(myFormat,{month:'2-digit'}).format(myDate);
console.log("The long month : "+monthLong);
console.log("The short month : "+monthShort);
console.log("The month number : "+monthNum);
console.log("The month 2 digits: "+month2);