2017-10-13 72 views
1

您好我正在Angularjs/JavaScript中开发Web应用程序。我有一个压光机选择器,我从前端捕捉日期。在数据库中保存选定的日期时,我想以Hijri格式保存。我跟着Converting Gregorian date to Hijri date,它在writeIslamicDate中传递1时正常工作。 例如:如何将javascript日期转换为hijri格式?

var today=new Date(); 
writeIslamicDate(today); 

如果我通过今天的日期,那么它给了我undefined, NaN undefined NaN AH,所以我知道我需要通过输入writeIslamicDate之前转换为任何格式?有人可以帮助我吗?任何帮助,将不胜感激。谢谢。

回答

2

可以使用矩hijri.js它强大的库来转换日期

Git Repo

moment('2014-11-28 16:40:00', 'YYYY-M-D HH:mm:ss').endOf('iMonth').format('iYYYY/iM/iD HH:mm:ss'); // 1436/2/30 23:59:59 

JSFIDDEL Exemple

+0

感谢。那么是否应该下载moment.js对不对?我试着用document.write(moment('2014-11-28 16:40:00','YYYY-MD HH:mm:ss')。endOf('iMonth')。format('iYYYY/iM/iH HH :MM:SS'));并没有得到什么 –

+0

是的应该,你可以使用鲍尔https://github.com/xsoh/moment-hijri –

+0

什么可能是2014-11-28 16:40:00回复日期?我得到了i2014/i11/i28 16:40:00? –

3

所有你需要的是一个轻微的调整,你链接的功能。要允许一个日期的可选调整的输入,你需要允许传递一个日期,以便进行以下修改:

function writeIslamicDate(adjustment) { 
    ... 
    var iDate = kuwaiticalendar(adjustment); 

function writeIslamicDate(date, adjustment) { 
    ... 
    var iDate = kuwaiticalendar(date, adjustment); 

function kuwaiticalendar(adjust) { 
    var today = new Date(); 

到:

function kuwaiticalendar(date, adjust) { 
    var today = date || new Date(); 

然后调用它无论是否约会。下面是完整的修改代码(稍微清理一下)。您还可以尝试带有选项的toLocaleString,该选项不仅可以转换为伊斯兰日历,还可以使用主机的默认语言。

// Returns mathematic mod, not javascript mod 
 
// e.g. gmod(-3, 2) returns 1, whereas -3%2 returns -1 
 
function gmod(n, m){ 
 
    return ((n % m) + m) % m; 
 
} 
 

 
/* @param {Date} date - optional, default is today 
 
** @param {number} adjust - optiona, days to adjust date by 
 
*/ 
 
function kuwaiticalendar(date, adjust) { 
 
    var today = date? new Date(+date) : new Date(); 
 
    if (adjust) { 
 
    today.setDate(today.getDate() + +adjust); 
 
    } 
 

 
    var day = today.getDate(); 
 
    var month = today.getMonth(); 
 
    var year = today.getFullYear(); 
 
    var m = month + 1; 
 
    var y = year; 
 

 
    if (m < 3) { 
 
     y -= 1; 
 
     m += 12; 
 
    } 
 

 
    var a = Math.floor(y/100); 
 
    var 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; 
 
    } 
 
    } 
 

 
    var 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); 
 
    } 
 

 
    var bb = jd+b+1524; 
 
    var cc = Math.floor((bb - 122.1)/365.25); 
 
    var dd = Math.floor(365.25 * cc); 
 
    var 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; 
 
    var wd = gmod(jd + 1, 7) + 1; 
 

 
    var iyear = 10631./30.; 
 
    var epochastro = 1948084; 
 
    var epochcivil = 1948085; 
 

 
    var shift1 = 8.01/60.; 
 

 
    var z = jd-epochastro; 
 
    var cyc = Math.floor(z/10631.); 
 
    z = z - 10631 * cyc; 
 
    var j = Math.floor((z - shift1)/iyear); 
 
    var iy = 30 * cyc + j; 
 
    z = z - Math.floor(j * iyear + shift1); 
 
    var im = Math.floor((z + 28.5001)/29.5); 
 

 
    if (im == 13) im = 12; 
 
    var id = z-Math.floor(29.5001*im-29); 
 

 
    return [ 
 
    day,  //calculated day (CE) 
 
    month - 1, //calculated month (CE) 
 
    year,  //calculated year (CE) 
 
    jd - 1, //julian day number 
 
    wd - 1, //weekday number 
 
    id,  //islamic date 
 
    im - 1, //islamic month 
 
    iy   //islamic year 
 
    ]; 
 
} 
 

 
function writeIslamicDate(date, adjustment) { 
 
    var wdNames = ["Ahad", "Ithnin", "Thulatha", "Arbaa", "Khams", "Jumuah", "Sabt"]; 
 
    var iMonthNames = ["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(date, adjustment); 
 
    var outputIslamicDate = wdNames[iDate[4]] + ", " + iDate[5] + " " + 
 
          iMonthNames[iDate[6]] + " " + iDate[7] + " AH"; 
 
    return outputIslamicDate; 
 
} 
 

 
// No date or adjust 
 
console.log(writeIslamicDate()); 
 
// No date, adjust to tomorrow 
 
console.log(writeIslamicDate(undefined, 1)); 
 
// Date for 1 Jan 2017 
 
console.log(writeIslamicDate(new Date(2017,0,1))); 
 
// Date for 1 Jan 2017, adjust by -1 day 
 
console.log(writeIslamicDate(new Date(2017,0,1), -1));

使用的toLocaleString你会做类似于下面的东西。

// date is optional, defaults to today 
 
function writeHijri(date, lang) { 
 
    var date = date || new Date(); 
 
    lang = lang || 'en'; 
 
    var options = { 
 
    year: 'numeric', month: 'long', day: 'numeric' 
 
    }; 
 
    return date.toLocaleString(lang + '-u-ca-islamic', options); 
 
} 
 

 
// Today in English 
 
console.log(writeHijri()); 
 

 
// 1 Jan 2017 converted to Hijri (3 Rab. II 1438) in Arabic 
 
console.log(writeHijri(new Date(2017,0,1), 'ar'));

相关问题