javascript - 如何将 javascript 日期转换为回历格式?

标签 javascript angularjs date

您好,我正在使用 Angularjs/JavaScript 开发 Web 应用程序。我有一个日历选择器,我正在从前端捕获日期。在数据库中保存选定日期时,我想以回历格式保存。我关注了Converting Gregorian date to Hijri date ,当我在 writeIslamicDate 中传递 1 时它工作正常。 例如:

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

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

最佳答案

您只需对您链接的函数稍作调整即可。要允许输入日期作为可选调整,您需要允许传入日期,因此请进行以下更改:

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'));

关于javascript - 如何将 javascript 日期转换为回历格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46725563/

相关文章:

javascript - 删除 Firebase 数组项并立即自动添加回来(使用 AngularFire)

javascript - AngularJS 选择选项预选

javascript - 如何使用 JavaScript 将 HTML 表格单元格中的日期更改为本地时间?

javascript - 了解 JavaScript 的作用域

asp.net - 在不支持 javascript 的浏览器中使用 ASP.NET

javascript - React Native 返回 [未处理的 promise 拒绝 : TypeError: Network request failed] when I'm making a Post Request

ios - 如何将字符串(例如 "xPM - yPM")拆分为两个字符串,Swift

javascript - Gulp - 更改缩小 CSS 的目的地

javascript - URL 重定向和重新加载在 Safari 和 IE 中不起作用

python - 使用Python Year 0的时间序列超出范围