首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js农历、日历代码

以下是一个使用JavaScript实现农历转换的示例代码:

代码语言:txt
复制
// 农历数据(这里只是简单示例部分数据)
const lunarInfo = [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
    // 更多数据...
];

// 月份天数对应(简单示例)
const monthDays = [29, 30];

function getLunarDate(year, month, day) {
    let offset = (Date.UTC(year, month - 1, day) - Date.UTC(1900, 0, 31)) / 86400000;
    let lunarYear = 1900;
    let lunarMonth = 1;
    let lunarDay = 1;
    let leap = false;

    while (offset >= getLunarYearDays(lunarYear)) {
        offset -= getLunarYearDays(lunarYear);
        lunarYear++;
    }

    let leapMonth = getLeapMonth(lunarYear);
    for (let i = 1; i <= 12; i++) {
        if (offset >= getLunarMonthDays(lunarYear, i)) {
            offset -= getLunarMonthDays(lunarYear, i);
            if (i == leapMonth) {
                if (offset == 0) {
                    leap = true;
                }
                if (leap) {
                    lunarMonth++;
                    leap = false;
                }
            }
            lunarMonth++;
        } else {
            break;
        }
    }
    lunarDay += offset;
    return { lunarYear, lunarMonth, lunarDay, leap };
}

function getLunarYearDays(year) {
    let sum = 348;
    for (let i = 0x8000; i > 0x8; i >>= 1) {
        sum += (lunarInfo[year - 1900] & i)? 1 : 0;
    }
    return sum + getLeapMonthDays(year);
}

function getLeapMonth(year) {
    return lunarInfo[year - 1900] & 0xf;
}

function getLeapMonthDays(year) {
    if (getLeapMonth(year)) {
        return (lunarInfo[year - 1900] & 0x10000)? 30 : 29;
    } else {
        return 0;
    }
}

function getLunarMonthDays(year, month) {
    if (month > 12 || month < 1) {
        return -1;
    }
    return (lunarInfo[year - 1900] & (0x10000 >> month))? 30 : 29;
}


// 示例用法
let solarDate = new Date();
let lunar = getLunarDate(solarDate.getFullYear(), solarDate.getMonth() + 1, solarDate.getDate());
console.log(`阳历 ${solarDate.getFullYear()}-${solarDate.getMonth() + 1}-${solarDate.getDate()} 对应的农历是 ${lunar.lunarYear}年${lunar.leap? '闰' : ''}${lunar.lunarMonth}月${lunar.lunarDay}日`);

一、基础概念

  1. 农历
    • 农历是一种阴阳合历,它根据月相的变化周期(朔望月)来确定一个月的长度,同时又考虑了地球绕太阳公转的周期(回归年)来设置闰月等规则,以保证农历年的平均长度接近回归年。
  • 阳历(公历)
    • 是以地球绕太阳公转的运动周期为基础而制定的历法。一年约为365.2422天,通常平年365天,闰年366天。

二、优势

  1. 文化传承方面
    • 农历在中国等亚洲国家有着深厚的文化底蕴,与传统节日(如春节、中秋节等)紧密相连,有助于传承民族文化。
  • 农业生产的参考(传统意义上)
    • 在过去,农历中的节气对于农业生产活动有着重要的指导意义,例如春分、秋分等节气标志着季节的转换,有助于农民安排农事。

三、类型

  1. 传统农历
    • 按照复杂的阴阳合历规则制定,包含闰月等特殊情况。
  • 简化农历
    • 在一些应用场景下,可能会采用简化的农历计算方式,主要关注月相变化和大致的节气对应。

四、应用场景

  1. 传统节日计算
    • 如确定春节的具体日期(农历正月初一),端午节(农历五月初五)等。
  • 民俗活动安排
    • 一些传统的民俗祭祀、婚丧嫁娶等活动可能会参考农历日期。

五、常见问题及解决方法

  1. 日期转换不准确
    • 原因:
      • 农历计算规则复杂,涉及到闰月、大小月等多种因素。如果农历数据不完整或者计算逻辑存在漏洞,就容易导致转换错误。
    • 解决方法:
      • 使用更全面的农历数据,并仔细检查计算逻辑。可以参考专业的天文算法或者使用成熟的农历库(如moment - lunar等)。
  • 时区问题
    • 原因:
      • 在计算日期差时,如果不考虑时区差异,可能会导致日期计算错误。例如,在不同地区使用本地时间进行转换时可能出现偏差。
    • 解决方法:
      • 统一使用协调世界时(UTC)进行日期计算,最后再转换为本地时间表示。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 谷歌日历的正确用法--在谷歌日历中添加农历、天气、中国节假日

    在PC端设置农历、天气、中国节假日 (1)添加农历: 在电脑通过浏览器打开google calender页面 https://calendar.google.com 并登录google帐号 设置--...添加日历--通过网址添加, 输入农历日历网址http://www.google.com/calendar/ical/ug2j3l2nqq7uch3m9n0pm5t2lo@group.calendar.google.com.../public/basic.ics 并确认 或者在日历主页点击“添加朋友的日历”后面的+号, 通过网址添加,输入农历日历网址http://www.google.com/calendar/ical/ug2j3l2nqq7uch3m9n0pm5t2lo...:农历、天气、中国节假日  实现的效果(看起来很好,省了另外安装天气和日历应用): -----------------------------------------------------------...原有的农历日历源失效,现在已经自带农历日历,在设置-一般设置-可选日历可以找到 2.

    77610

    如何为Power BI日历图表增加农历、节气、节日、星座以及其他任何信息

    上一节介绍了如何在Power BI中设计一个简约的日历图表,如下图所示。本文更进一步,尝试为该日历增加信息,依然使用内置的矩阵去设计。...日历可以突出显示今天(27日),并且增加农历: 可以增加星座: 还可以农历、节气、节日同时显示: 显示信息可以切片器动态切换,法定节假日有休假和上班调休提醒: 除了日历相关的内容,还可以增加模型中的指标信息提示...+节气+节日",SELECTEDVALUE('日期表'[农历节日节气]),"农历",SELECTEDVALUE('日期表'[农历]),"星座",SELECTEDVALUE('日期表'[星座]),BLANK...日期居中,农历在日期下方,放假安排在右上角,像素级对齐。rect加在当天显示为圆角正方形。...完整Power BI模板扫码下载,预存了2021、2022年的日历,以及2022年的放假信息,读者明年可直接使用,后年更新下相关信息即可。

    2.7K40

    私人定制日历代码改进

    分别为: R可视乎|2021年日历大派送 calendR包—私人定制专属日历 并开源了自己的代码在github上,但是细心的读者发现代码还存在可以优化的地方。...这里十分感谢楚新元师兄,对我给出的代码进行了优化,并分享了修改后的代码和私人日历。...2.输出pdf文件名重复 原来代码重复运行时,pdf输出会存在报错情况,如下所示: ? 当时为了方便直接改文件名了。现在对代码进行优化,在输出日历前加入以下代码来判断文件是否存在,如果存在先删除。...这样就不会存在文件名重复的情况,如果你想保留原来的文件,可以自己写代码把这段代码换了。...生成年度日历图优化后代码如下: library(calendR) library(showtext) setwd("C:\\Users\\ZLL\\Desktop\\wechat\\庄闪闪原创\\R\\

    1K20

    Qt开源作品30-农历控件

    一、前言 农历控件在国产linux中必备的控件之一,毕竟要适应国人的习惯,你看win10系统的日历,现在点开来直接就有农历在上面,非常方便人性化,所以在很多用Qt做的项目中,也有农历控件的应用场景,而Qt...自带的日历控件比较简单,仔细看过源码的人也只知道,其实就是一堆微调框,下拉框,表格组成的,于是打算借用此方法造一个农历控件,本控件的算法是倪大侠提供的,个人测试下来还是没有问题的,造这个农历控件最大的难点是如何根据日期计算农历时间...,再加上一些农历的节气之类的,这个网上估计也有很多的算法参考。...主要功能: 可设置边框颜色/周末颜色/角标颜色/农历节日颜色 可设置当前月文字颜色/其他月文字颜色/选中日期文字颜色/悬停日期文字颜色 可设置当前月农历文字颜色/其他月农历文字颜色/选中日期农历文字颜色...可设置是否显示农历信息,不显示则当做正常的日历使用 支持1900年-2099年范围 很方便改成多选日期 二、代码思路 void LunarCalendarItem::paintEvent(QPaintEvent

    1.7K20

    前端|利用js实现在日历中的签到效果

    效果介绍 日历在手机软件里是非常常见的一个功能,几乎每一个手机都有一个自带的手机日历软件。签到功能也是特别常用的,学习通、淘宝、包括学校使用的热水软件U易也都有运用。...在一些签到获取积分(或者其他奖励)的软件中,签到和日历功能常常是捆绑使用。我们今天要实现的也是签到功能和日历捆绑在一起的效果。 本次的实现效果如下图1.1: ?...图2.1 签到成功效果图 实现过程 概述实现步骤:①创建相应的文件,并在HTML5中引入;②利用HTML5代码对页面框架进行搭建;③利用css对“签到”前后样式变化进行调整;④利用JavaScript...对日历进行实现; 关于日历功能实现的具体步骤: (1)利用HTML5代码对页面框架进行搭建: div> 日历表格。

    5.5K21

    dify工作流+deepseek开启联网搜索

    \n---\nTitle: 【日历】农历查询_今天是什么日子_今天是农历几月几日- 千问网\nLink: https://www.qianask.com/nongli/\nDescription: 今天的日子是...\n---\nTitle: 【农历日历】今天农历多少今天是农历几月几日农历日期几号\nLink: https://m.fuhaoku.net/nongli/\nDescription: 今天是农历:2025...\n---\nTitle: 【日历】农历查询_今天是什么日子_今天是农历几月几日- 千问网\nLink: https://www.qianask.com/nongli/\nDescription: 今天的日子是...\n---\nTitle: 【农历日历】今天农历多少今天是农历几月几日农历日期几号\nLink: https://m.fuhaoku.net/nongli/\nDescription: 今天是农历:2025...另外,多个工具网站,如ToolTT、千问网和农历日历,都显示2025年2月15日是星期六,并且今天的日期在公历中为2月16日,这似乎存在矛盾。\n\n我需要考虑时区因素,因为不同地区可能有不同的时间。

    1.7K21

    Android的CalendarView控件使用及日期进行农历转换

    前言 我们在做一些日历或是对一些重要日期记录时有时会用到农历,Android里面网上可以看到一些农历的相关类,我们这里也是在度娘里找到的直接借用一下,主要是来介绍怎么使用。 视频演示效果 ?...代码演示 我们新建一个工程起名为LunarDemo ? 然后在MainActivity的同级创建一个java的类,起名为Lunar,然后这个类里面用就我们的核心代码,代码在最后会贴出。...首先我们把布局的layout改为LinnerLayout,并设置为垂直布局(orientation="vertical"),然后增加一个CalendarView的日历控件,一个TextView的文本框和一个...实现思路就是用日期控件点击选取日期,然后按获取农历按钮在文本框中显示当前农历日期,并弹出个Toast提示框显示当前是什么属相年。 然后我们回到MainActivity.java来看看实现方法 ? ?...用一个Calendar初始化日历,然后在calendarview日历控件的里面设置onSelectedDayChange事件用来修改选中的日期。

    3K30

    教你用SQL生成一张带「农历」的日期维度表

    农历与世界通用的日历有所区别,是科学家演算出来的,目前为止只有到2049年的,以后的有了还可以加入! 所以我们可以把已经演算出来的具体农历制作成一张表,通过调用当前的日期来返回具体的农历。...0x1b255',111189 UNION ALL SELECT 2048,'0x06d20',27936 UNION ALL SELECT 2049,'0x0ada0',44448 (提示:可以左右滑动代码...我们创建的是一个农历的函数,当我们将日期传递给这个函数,其就会返回具体的日历了。...SELECT dbo.fn_GetLunar('2021-02-19') Lunar 查看一下返回的结果: 我们去查了一下日历,验证结果是正确的 将农历加入到日历表 已经获得了公历转换成农历的转换函数...修改一下日历表结构(在表CALENDAR_INFO 中添加一个字符串格式的字段Lunar)和存储过程。

    23910
    领券