获取阴历(农历)和当前日期的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日

相关文章

  • javascript 兼容各个浏览器的事件

    JS 兼容各个浏览器的事件主要是针对旧版浏览器(如IE 8及以下版本)的事件处理进行兼容。 一、事件绑定兼容处理 旧版浏览器中经常使用 attachEvent 方法绑定事件,而现代浏览器则使用 addEventListener 方法。因此需要对这两种方法进行不同的处理以实现跨浏览器兼容。 function addEventHandler(element, e…

    JavaScript 2023年6月10日
    00
  • JS函数验证总结(方便js客户端输入验证)

    JS函数验证是用JavaScript编写的表单客户端输入验证,目的是方便用户输入验证,减少对服务器沟通请求,缩短请求响应时间和提高用户体验。下面是JS函数验证的完整攻略: 1.概述 JS函数验证是对用户的输入数据预先验证,验证的方式可以使用JS正则表达式、API等方式,可以在用户提交表单到服务器之前,即在本地网页浏览器中对数据进行验证。这样可以减少不必要的请…

    JavaScript 2023年6月11日
    00
  • javascript模拟实现计算器

    为了让大家更好地理解,我先解释一下什么是JavaScript模拟实现计算器,然后再提供完整攻略。 JavaScript模拟实现计算器,是指使用JavaScript语言来模拟实现一个计算器的功能,可以通过输入数字、运算符和特殊符号等来进行基本的数学运算,如加、减、乘、除以及求余数等。 现在来说一下实现这个功能的具体攻略: HTML 部分 首先在 HTML 中创…

    JavaScript 2023年5月27日
    00
  • Ajax 数据请求的简单分析

    下面我将为你详细讲解“Ajax 数据请求的简单分析”的完整攻略。 什么是Ajax Ajax即Asynchronous JavaScript and XML。它是利用JS和XML进行异步通信技术的一种方法。 当我们在浏览器中访问网页时,通常情况下需要向服务器请求数据,服务器通过传统的方式返回数据并展示在浏览器上。而使用Ajax技术,可以在不重新加载整个网页的情…

    JavaScript 2023年6月11日
    00
  • js+canvas绘制五角星的方法

    这里是“js+canvas绘制五角星的方法”的完整攻略。 1. 准备工作 在开始绘制五角星之前,需要准备好以下工作: 在HTML文件中添加一个Canvas标签用于绘图; 在Javascript中获取Canvas元素,并获取它的2D上下文,以便可以在Canvas上绘制图形; 定义绘制五角星的函数,该函数应该接收五角星的中心点坐标、半径、线宽和填充颜色等参数。 …

    JavaScript 2023年5月28日
    00
  • 用javascript实现截取字符串包含中文处理的函数

    下面我将详细讲解如何使用 JavaScript 实现截取字符串包含中文处理的函数。 函数实现思路 在 JavaScript 中,一个英文字符和一个中文字符所占用的字节数是不同的。一个英文字符占用 1 个字节,而一个中文字符占用 2 个字节。因此,在截取字符串时,不能直接按照字符个数进行截取,否则会出现截取的字符串超出范围或截取不完整的情况。具体实现思路是使用…

    JavaScript 2023年5月28日
    00
  • 一文带你搞懂JavaScript中转义字符的使用

    一文带你搞懂JavaScript中转义字符的使用 在JavaScript中,转义字符是指以反斜线 “\” 开头的字符,用于表示在字符串中无法直接输入的内容,比如双引号,单引号,换行符等。下面我们来详细讲解JavaScript中转义字符的使用。 转义字符的使用 使用转义字符时,需要将反斜线和需要转义的字符组合使用。下面是一些常见的转义字符及其含义: 转义字符 …

    JavaScript 2023年5月20日
    00
  • javascript中数组array及string的方法总结

    JavaScript中数组(Array)及字符串(String)方法总结 在JavaScript中,数组以及字符串是非常重要的数据结构,同时也拥有很多的内置方法可以简化我们的开发流程。接下来将带你了解这些方法。 字符串(String)方法 1. indexOf 返回某个指定的子字符串在字符串中第一次出现的位置。 const str = "Hello…

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