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

yizhihongxing

获取阴历(农历)和当前日期是网站中常见的功能之一。使用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日

相关文章

  • AutoJs4.4.1免费版快速接通vscode调试脚本的操作方法

    下面是“AutoJs4.4.1免费版快速接通vscode调试脚本的操作方法”的完整攻略: 操作方法 安装AutoJs4.4.1免费版 首先需要安装AutoJs4.4.1免费版,可以在官网或者GitHub上下载相应的安装包。安装完成后,打开AutoJs应用。 安装AutoJs插件 在VSCode中,搜索安装“AutoJs插件”,下载安装后重新启动VSCode。…

    JavaScript 2023年6月11日
    00
  • Python、Javascript中的闭包比较

    下面我将详细讲解Python和JavaScript中的闭包比较。 什么是闭包? 在JavaScript和Python中,闭包是指可以访问外部函数作用域的函数。简单地说,内部函数可以访问外部函数中的变量。这意味着,即使外部函数已经返回,内部函数也可以访问并操作它们。 Python中的闭包 下面我们来看一个Python中的闭包示例: def outer_func…

    JavaScript 2023年6月10日
    00
  • Javascript 实现复制(Copy)动作方法大全

    Javascript 实现复制(Copy)动作方法大全 在 Web 开发过程中,经常需要实现复制文本、复制图片等功能。本文将介绍 Javascript 实现复制操作的几种方法。 一、使用 document.execCommand() document.execCommand() 是一个常用的实现复制操作的方式。它可以执行不同的命令,包括复制命令,以实现文本、…

    JavaScript 2023年6月11日
    00
  • JavaScript setTimeout()基本用法有哪些

    JavaScript setTimeout()基本用法 setTimeout()是JavaScript中的一个内置函数,它可以在指定的时间间隔后执行一段代码。在JavaScript中,setTimeout()函数的用法非常广泛,常用于网页中的动画效果、延迟执行代码等。 setTimeout()函数的语法 setTimeout()函数的语法如下: setTim…

    JavaScript 2023年6月11日
    00
  • JS实现的base64加密解密完整实例

    让我详细讲解一下”JS实现的base64加密解密完整实例”的完整攻略。 什么是Base64加密解密? Base64是一种常见的编码方式,可以将ASCII码转换为可打印字符,以便在网络上传输。Base64编码有助于将二进制数据转换为文本格式。使用Base64编码后,即使在不传输二进制数据的情况下,也可以将其转移并保存在文本文件中。 Base64编码使用64个字…

    JavaScript 2023年5月19日
    00
  • jquery.qtip提示信息插件用法简单实例

    下面就来详细讲解“jquery.qtip提示信息插件用法简单实例”的完整攻略。 什么是jquery.qtip提示信息插件 jquery.qtip提示信息插件是一个jQuery插件,它可以用来在页面中快速、方便地创建提示信息。其使用简单,功能强大,支持各种提示效果,是一款非常实用的前端开发工具。 jquery.qtip提示信息插件的安装和使用 jquery.q…

    JavaScript 2023年6月11日
    00
  • pdf2swf+flexpapers实现类似百度文库pdf在线阅读

    PDF2SWF是一个将PDF文件转换为SWF文件的开源工具,FlexPaper 是一个基于 Flash 的开源文档阅读器。联合使用这两个工具可以用来实现类似百度文库 PDF 在线阅读的效果。 下面是实现该过程的完整攻略: 步骤1:安装和配置软件 安装 PDF2SWF。PDF2SWF 可以从http://www.swftools.org/download.ht…

    JavaScript 2023年6月11日
    00
  • IP查询系统的异步回调案例

    IP查询系统的异步回调案例可以分为以下几个步骤: 1.向第三方IP查询系统发出请求,获取IP信息。 2.解析获取到的IP信息,提取需要的数据。 3.对提取到的数据进行存储和处理。 4.将处理完成后的数据通过异步回调的方式返回给用户。 以下是详细的攻略: 第一步:请求IP信息 在代码中,这一步可以使用HTTP请求库向第三方IP查询系统发起GET请求,获取用户输…

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