首页
学习
活动
专区
工具
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)进行日期计算,最后再转换为本地时间表示。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

5分40秒

27.尚硅谷_JS基础_代码块

1分26秒

在线JavaScript加密,提交JS代码、上传Zip文件

46秒

JS代码压缩,减小体积、优化逻辑、提升效率

16分40秒

JavaScript教程-25-JS代码的执行顺序【动力节点】

58秒

在VS Code中使用JShaman插件混淆加密JS代码

1分18秒

两种Eval加密,适用于JS代码加密

4分46秒

JavaScript教程-25-JS代码的执行顺序2【动力节点】

41分27秒

89. 尚硅谷_佟刚_JavaWEB_文件上传案例_JS代码.wmv

1分31秒

JShaman本地部署英文版,测试加密700K的JS代码

27分8秒

1. 尚硅谷_佟刚_JavaScript DOM编程_在什么位置编写 JS 代码.wmv

27分8秒

1. 尚硅谷_佟刚_JavaScript DOM编程_在什么位置编写 JS 代码.wmv

58秒

JShaman一键JS代码混淆,并显示前后AST节点数量差异

领券