获取阴历(农历)和当前日期的js代码

获取阴历(农历)和当前日期是网站中常见的功能之一。使用JavaScript实现这个功能需要借助第三方库或者手写算法。

一、使用第三方库

推荐使用lunar-calendar这个JavaScript库,该库提供了方便的API实现将阳历日期转换为阴历日期。在获取当前日期的情况下,可以直接使用JavaScript的Date对象获取。具体步骤如下:

  1. 下载lunar-calendar库,包含lunar.calendar.js和solar-term.js两个文件。
  2. 在HTML页面中引入上述两个JavaScript文件。可以使用CDN引入或者下载下来进行引入:
    <script src="https://cdn.jsdelivr.net/npm/lunar-calendar/dist/lunar-calendar.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/lunar-calendar/dist/solar-term.min.js"></script>

    <script src="/path/to/lunar.calendar.js"></script>
    <script src="/path/to/solar-term.min.js"></script>
  3. 使用以下代码实现将当前日期转换为阴历日期:

javascript
// 获取当前日期
const now = new Date();
// 将当前日期转换为阴历日期
const lunarDate = calendar.solar2lunar(now.getFullYear(), now.getMonth() + 1, now.getDate());
console.log(lunarDate);

上述代码使用了calendar.solar2lunar()方法,该方法将输入的农历日期转换成阳历日期。它接受3个参数,分别为:

  1. 年份(公历)
  2. 月份(公历)
  3. 日(公历)

它返回一个对象,包含以下属性:

  • year:阴历年份
  • month:阴历月份
  • day:阴历日
  • isLeap:是否为闰月

二、手写算法

如果不想引入额外的JavaScript库,也可以手写算法来实现将阳历日期转换为阴历日期。以下是一个简单的实现方法:

function getLunarDate(year, month, day) {
  // 计算阳历时间戳
  const solarTimestamp = new Date(year, month - 1, day).getTime();
  // 初始值(农历1900年1月1日)
  const baseTimestamp = new Date(1900, 0, 31).getTime();
  const offset = (solarTimestamp - baseTimestamp) / 86400000; // 86400000为一天的毫秒数
  // 农历年份,月份,日份以及是否为闰月,默认为非闰月
  let lunarYear = 1900;
  let lunarMonth = 1;
  let isLeapMonth = false;
  let lunarDay = 1;
  // 当前年份到基准年份(1900)之间的总天数
  let days = 0;
  // 阳历年份每年的天数
  const solarYearDays = [31,28,31,30,31,30,31,31,30,31,30,31];
  // 农历月份每月的天数
  const lunarMonthDays = [
    0x1555, // 29天
    0x14d5, // 30天
    0x1552, // 29天
    0x14d2, // 30天
    0x1c12, // 29天
    0x14b6, // 30天
    0x1525, // 29天
    0x14a5, // 30天
    0x1553, // 29天
    0x14d8, // 30天
    0x1552, // 29天
    0x14a2  // 30天
  ];
  // 循环计算阳历日期距离基准日期的总天数
  for (let i = 1900; i <= year; i++) {
    // 当前年份是否为闰年
    const isLeapYear = ((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0);
    // 遍历当前年份的天数
    for (let j = 0; j < 12; j++) {
      // 如果当前年份为闰年,2月的天数加1
      if (isLeapYear && j == 1) {
        days += 1;
      }
      days += solarYearDays[j];
    }
  }
  // 根据已计算的总天数计算农历年份、月份、日份
  lunarYear = 1900 + Math.floor(days / 365);

  days %= 365;
  for (let i = 0; i < 12; i++) {
    const monthDays = (lunarMonthDays[lunarYear - 1900] >> i) & 0x1f;
    if (days >= monthDays) {
       days -= monthDays;
       lunarMonth++;
    } else {
      if (i == 10 && lunarMonth > 1 && !isLeapMonth) {
        lunarMonth--;
      }
      if (i == 10 && lunarMonth == 1 && isLeapMonth) {
        lunarMonth = 12;
      }
      isLeapMonth = (((lunarMonthDays[lunarYear - 1900] >> 12) & 0x1) == 1);
      lunarDay = days + 1;
      break;
    }
  }     
  return {
    year: lunarYear,
    month: lunarMonth,
    day: lunarDay,
    isLeapMonth: isLeapMonth
  };
}

// 调用示例
const now = new Date();
const lunarDate = getLunarDate(now.getFullYear(), now.getMonth() + 1, now.getDate());
console.log(lunarDate);

上述手写算法中,使用了以下三个数据结构来表示农历信息:

  1. solarYearDays:每年的阳历天数
  2. lunarMonthDays:每月的阴历天数
  3. lunarDate:计算结果,包含年份、月份、日以及是否为闰月

这个算法的核心是将阳历日期转换为从农历1900年1月1日开始的天数(offset),然后计算出从1900年到当前阳历日期所经过的农历年份和天数,再根据农历每年的天数和每月的天数计算出当前农历日期。

本手写算法的实现方法比较复杂,适合于需要深度理解阴历转换原理的前端开发者。如果只需要简单的阴历日期转换功能,推荐使用第三方库lunar-calendar。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:获取阴历(农历)和当前日期的js代码 - Python技术站

(1)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JSP request.setAttribute()详解及实例

    我可以为您提供JSP request.setAttribute()的详细攻略。 什么是request.setAttribute()? 在JSP中,request.setAttribute()是一个用于在request对象中设置属性值的方法。它是通过request对象将数据从服务器端传递到客户端的一个常用方式。 通常,我们通过JSP页面和JavaBean之间的…

    JavaScript 2023年6月10日
    00
  • javascript 静态对象和构造函数的使用和公私问题

    JavaScript中的对象包括静态对象和实例对象,其中静态对象是通过构造函数定义的属性和方法的集合,可以通过构造函数名直接访问,而实例对象则是由构造函数实例化出来的。在 JavaScript 中,对象可以拥有公共方法和私有方法,公共方法可由对象直接访问,私有方法只能在构造函数内部使用。 静态对象使用 在 JavaScript 中,我们可以使用构造函数来定义…

    JavaScript 2023年6月10日
    00
  • 浅谈 javascript 事件处理

    浅谈 JavaScript 事件处理 事件处理是 JavaScript 中非常重要的一个概念,涵盖了很多方面的知识,比如事件的冒泡、捕获、绑定、解绑等等。本文将从以下几个方面介绍 JavaScript 事件处理的相关内容。 1. 事件类型 JavaScript 支持多种类型的事件,其中常见事件类型包括: 鼠标事件:click、mousedown、mouseu…

    JavaScript 2023年5月18日
    00
  • String字符串匹配javascript 正则表达式

    String字符串匹配javascript 正则表达式 什么是正则表达式 正则表达式是一种用来匹配、查找和替换文本的工具,它可以精确匹配一个或多个字符,也可以通过通配符匹配一类字符。在Javascript中,我们可以使用RegExp类来操作正则表达式。 正则表达式的基本语法 在 Javascript 中,正则表达式可以使用字面量或者RegExp类来创建。 使…

    JavaScript 2023年5月28日
    00
  • asp.net Javascript获取CheckBoxList的value

    下面我将详细讲解如何使用 JavaScript 在 ASP.NET 中获取 CheckBoxList 的值。 1. 获取 CheckBoxList 中选中项的值 要想获取 CheckBoxList 中选中项的值,可以通过以下的方式实现: // 获取 CheckBoxList 的实例 var cbList = document.getElementById(‘…

    JavaScript 2023年6月10日
    00
  • Javascript中JSON数据分组优化实践及JS操作JSON总结

    让我来详细讲解一下“Javascript中JSON数据分组优化实践及JS操作JSON总结”的完整攻略。 1. 分组优化实践 在实际开发中,我们经常需要对 JSON 数据进行分组操作。接下来我们将以示例代码为例,讲解如何优化分组操作。 1.1. 基础操作 let data = [ { name: ‘Apple’, type: ‘fruit’ }, { name…

    JavaScript 2023年5月27日
    00
  • JS实现表单中点击小眼睛显示隐藏密码框中的密码

    当用户在表单中输入密码时,通常会提供一个“显示密码”的选项,这使得用户可以查看其输入的密码而不必担心输错。下面是一些使用JavaScript实现显示密码选项的攻略。 第一步:HTML结构 首先,我们需要创建一个包含密码和复选框的HTML结构。在密码输入框后面放置一个复选框,在复选框后面标注“显示密码”。以下是HTML代码示例: <label> P…

    JavaScript 2023年6月10日
    00
  • js选择并转移导航菜单示例代码

    下面是js选择并转移导航菜单的攻略。首先我们需要明确一下我们需要做的事情,即从一个导航菜单中选择若干个元素,并将这些元素转移至另一个导航菜单中。具体实现步骤如下: 1. 准备工作 首先在HTML文档中,我们需要准备两个导航菜单的容器元素,以及一个按钮元素用于触发选中操作。例如,我们可以按照以下代码编写容器元素: <div class="con…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部