类代码

// 下面是一个关于C#的农历算法
// 日期数据定义方法如下
// 前12个字节代表1-12月为大月或是小月,1为大月30天,0为小月29天,
// 第13位为闰月的情况,1为大月30天,0为小月29天,第14、15位为闰月的月
// 份,使用10进制表示。最后4位为当年家农历新年-即农历1月1日所在公历
// 的日期,如0131代表1月31日。
// 日期函数使用方式如下i公历年为要输入的公历年,i公历月为公历月,i公历日为
// 公历日,返回值为:属相 ,天干地支,农历年农历月农历日。

using System;

namespace 农历组件
{
public class 农历
{
private string[] m_str农历日历表;
private string[] m_str天干地支表;
private string m_str属相表;
private string m_str农历月表;
private string m_str农历日表;
private int m_i最大公历年份;
private int m_i最小公历年份;

public 农历()
{
m_str农历日历表 = new string[] {
"0100101101101080131",
"0100101011100000219",
"1010010101110000208",
"0101001001101050129",
"1101001001100000216",
"1101100101010000204",
"0110101010101040125",
"0101011010100000213",
"1001101011010000202",
"0100101011101020122",
"0100101011100000210",
"1010010011011060130",
"1010010011010000218",
"1101001001010000206",
"1101010101001050126",
"1011010101010000214",
"0101011010100000204",
"1001011011010020123",
"1001010110110000211",
"0100100110111070201",
"0100100110110000220",
"1010010010110000208",
"1011001001011050128",
"0110101001010000216",
"0110110101000000205",
"1010110110101040124",
"0010101101100000213",
"1001010101110000202",
"0100100101111020123",
"0100100101110000210",
"0110010010110060130",
"1101010010100000217",
"1110101001010000206",
"0110110101001050126",
"0101101011010000214",
"0010101101100000204",
"1001001101110030124",
"1001001011100000211",
"1100100101101070131",
"1100100101010000219",
"1101010010100000208",
"1101101001010060127",
"1011010101010000215",
"0101011010100000205",
"1010101011011040125",
"0010010111010000213",
"1001001011010000202",
"1100100101011020122",
"1010100101010000210",
"1011010010101070129",
"0110110010100000217",
"1011010101010000206",
"0101010110101050127",
"0100110110100000214",
"1010010110110000203",
"0101001010111030124",
"0101001010110000212",
"1010100101010080131",
"1110100101010000218",
"0110101010100000208",
"1010110101010060128",
"1010101101010000215",
"0100101101100000205",
"1010010101110040125",
"1010010101110000213",
"0101001001100000202",
"1110100100110030121",
"1101100101010000209",
"0101101010101070130",
"0101011010100000217",
"1001011011010000206",
"0100101011101050127",
"0100101011010000215",
"1010010011010000203",
"1101001001101040123",
"1101001001010000211",
"1101010100101080131",
"1011010101000000218",
"1011011010100000207",
"1001011011010060128",
"1001010110110000216",
"0100100110110000205",
"1010010010111040125",
"1010010010110000213",
"1011001001011100202",
"0110101001010000220",
"0110110101000000209",
"1010110110101060129",
"1010101101100000217",
"1001001101110000206",
"0100100101111050127",
"0100100101110000215",
"0110010010110000204",
"0110101001010030123",
"1110101001010000210",
"0110101100101080131",
"0101101011000000219",
"1010101101100000207",
"1001001101101050128",
"1001001011100000216",
"1100100101100000205",
"1101010010101040124",
"1101010010100000212",
"1101101001010000201",
"0101101010101020122",
"0101011010100000209",
"1010101011011070129",
"0010010111010000218",
"1001001011010000207",
"1100100101011050126",
"1010100101010000214",
"1011010010100000214"  
};
m_str属相表 = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
m_str农历月表 = "正二三四五六七八九十寒腊";
m_str农历日表 = "初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十";
m_i最大公历年份 = 2011;
m_i最小公历年份 = 1900;

string str天干 = "甲乙丙丁戊已庚辛壬癸";
string str地支 = "子丑寅卯辰巳午未申酉戌亥";
m_str天干地支表 = new string[60];
for (int i = 0; i < 60; i++)
{
m_str天干地支表[i] = str天干.Substring(i % 10, 1) + str地支.Substring(i % 12, 1);
}

}

public string 日期(int i公历年,
int i公历月,
int i公历日)
{
if ((i公历年 < m_i最小公历年份) || (i公历年 > m_i最大公历年份))
{ //如果不是有效公历日期,退出。
return "无效公历年份";
}

// 计算农历年
int i农历年;
int i农历月;
int i农历日;

i农历年 = i公历年;
// 农历新年月份
i农历月 = Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(15, 2)));
// 农历新年日子
i农历日 = Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(17, 2))); ;

if ((i公历月 < i农历月) || ((i公历月 == i农历月) && (i公历日 < i农历日)))
{
i农历年--;
// 农历新年月份
i农历月 = Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(15, 2)));
// 农历新年日子
i农历日 = Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(17, 2))); ;
}

// 计算农历月
DateTime dt公历日期 = new DateTime(i公历年, i公历月, i公历日);
DateTime dt农历日期 = new DateTime(i农历年, i农历月, i农历日);
TimeSpan ts日期差 = dt公历日期 - dt农历日期;
int i天数 = ts日期差.Days;

i农历月 = 1;
i农历日 = 1;
bool b闰月 = false;
for (int i = 0; i < i天数; i++)
{
i农历日++;
if (i农历日 == 30 + Convert.ToInt32(m_str农历日历表[i农历年 - m_i最小公历年份].Substring(i农历月 - 1, 1)) ||
(b闰月 && (i农历日 == 30 + Convert.ToInt32(m_str农历日历表[i农历年 - m_i最小公历年份].Substring(12, 1)))))
{
if ((b闰月 == false) && (i农历月 == Convert.ToInt32(m_str农历日历表[i农历年 - m_i最小公历年份].Substring(13, 2))))
{
b闰月 = true;
}
else
{
b闰月 = false;
i农历月++;
}
i农历日 = 1;
}
else
{
}
}

// 计算农历日
string str农历日 = m_str农历日表.Substring((i农历日 - 1) * 2, 2);

// 计算农历月
string str农历月 = m_str农历月表.Substring(i农历月 - 1, 1) + "月";
if (b闰月)
{
str农历月 = "闰" + str农历月;
}

// 农历年
string str农历年 = Convert.ToString(i农历年, 10) + "年";

// 计算天干地支
string str天干地支 = m_str天干地支表[(i农历年 - 4) % 60];

// 计算属相
string str属相 = m_str属相表.Substring((i农历年 - 4) % 12, 1);

// 返回农历日期
return str属相 + "," + str天干地支 + "," + str农历年 + str农历月 + str农历日;
}
}
}

应用示例

农历组件.农历 lc = new 农历组件.农历();
Response.Write(lc.日期(2009, 10, 13));

显示为:

牛,已丑,2009年八月廿五

转载于:https://www.cnblogs.com/n666/archive/2009/12/15/2190978.html

农历算法-ASP.NET(C#)(转)相关推荐

  1. 写日历的程序员,你必须弄懂的中国农历算法。

    写日历的程序员,你必须弄懂的中国农历算法. NANSHAN即时通讯,我们知道农历通过置闰月的方式协调农历年和回归年长度不相等的问题,也知道了置闰的方法是"中气置闰"法,那么到底什么 ...

  2. java有阴历年算法吗_中国农历算法java实现

    /** * 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年 */ import java.text.*; import java.util.*; class Chines ...

  3. php农历生日计算,php实现的农历算法实例

    本文实例讲述了php实现的农历算法.分享给大家供大家参考.具体如下: function lunarcalendar ($month, $year) { global $lnlunarcalendar; ...

  4. C#:实现公历转农历算法(附完整源码)

    C#:实现公历转农历算法 public class LunDay{public LunDay(){//// TODO: 在此处添加构造函数逻辑//}//天干private static string[

  5. java 农历算法_中国农历算法java实现

    /** * 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年 */ import java.text.*; import java.util.*; class Chines ...

  6. java 农历_Java 农历算法

    Java 农历算法 public class Lunar { private int year; private int month; private int day; private boolean ...

  7. C++实现的农历算法

    农历算法简介以及公式 一.节气的计算  先给节气进行编号,从近日点开始的第一个节气编为0,编号如下及其相应的月份如下: 0 小寒 腊月 6  清明 三月 12 小暑 六月 18 寒露 九月 1 大寒 ...

  8. 厉害了!中国农历算法

    Copyright (c) 1997-2002 by Dr. Herong Yang 中国农历算法 -  实用于公历 1901 年至 2100 年之间的 200 年. public class Cal ...

  9. Java250 amp 249_中国公历算法amp;中国农历算法(JAVA)

    中国公历算法不是太难,关键是星期值的确定.这里给出了简单算法: public static int dayOfWeek(int y, int m, int d) { int w = 1; // 公历一 ...

最新文章

  1. Swift 3.1新改动
  2. JSON.toJSONString
  3. 页面访问的常见错误码解析
  4. 飞鸽传书2011绿色版简单性
  5. discuz 表结构
  6. spring 常用注解汇总
  7. 修改DevExpress中英文提示,将英文改为中文
  8. VC++/MFC学习笔记(二)
  9. 消防荷载楼板按弹性还是塑性计算_技术周刊 | 关于荷载输入若干问题的解答
  10. 计算机二级java应用题怎么答,2015年计算机二级考试JAVA基本操作和简单应用题
  11. 摘要标红:十四五国家政务信息化规划
  12. Exception: ROM is missing for pong, see https://github.com/openai/atari-py#roms for instructions
  13. 使用docker运行mysql:5.7
  14. KEIL5 AC6 出现printf告警
  15. linux端口共享打印机,linux如何共享打印机
  16. 使用gcc编译报错:/tmp/ccoLTk4o.o:在函数‘main’中: main1.c:(.text+0x9c):对‘pirnt1’未定义的引用 collect2: 错误:ld 返回 1
  17. 彭亮—Python学习
  18. 微信小程序沉浸式布局
  19. python接口自动化测试框架pdf,Python接口自动化测试框架设计到开发完整版2019
  20. 程序员离职五大原因,为何跳槽大数据成首选?

热门文章

  1. 不用归一化,深度学习模型也可以很优秀!
  2. 哈工大与北大提出注意力引导的图像去噪
  3. 2020年最前沿的 8 本AI技术图书—文末留言赠8本
  4. 计算机编程结束进程代码,M代码如何停止CNC编程的程序
  5. ResNet超强变体CoTNet!一种新的Transformer计算机视觉模块!
  6. 语音交互有哪些优势与劣势?
  7. python的gc模块_Python的内存泄漏及gc模块的使用分析
  8. 关闭word_记一次毕设消失事件始末,及mac+word文档消失恢复方法汇总
  9. nginx location proxy_pass 后面的url 加与不加/的区别
  10. 什么是mysql的索引_什么是MySQL索引?【详解】