中华农历论坛知识讨论区历法知识 → 新阴阳历


  共有51967人关注过本帖树形打印

主题:新阴阳历

帅哥哟,离线,有人找我吗?
txwdx
  31楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2011/12/31 12:14:00

又看了500年。增加第六条规则之后,基本没问题。中间出现了3次(2558、2797、2892)春分跑到正月,而这三次均是雨水(三次雨水均为2点以前)、春分处于同一个月。
其实应该为二月(现行农历均为正月),不过又得增加一条。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
txwdx
  32楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2011/12/31 12:20:00

以下是引用浪-淘-沙在2011-12-31 12:11:00的发言:

这一条是我所担心的。(好像我前面提到过了。)

因为理论上讲,历谱是每年推出一本的。(《中国天文历年》也一样,每年只提供一个版本,第二年的版本,到时候继续推算。不能提前计算,或许是担心出现天象大变吧。)

你颁布了今年的历谱后,到了年底,发现明年的历谱有缺陷,然后再改今年的历谱。似乎不好办了。

 

当然了,用电脑程序,一下子可以计算前后几千年的历谱,理论上讲,是可以事先调整好历谱的。只是这个缺陷,有点遗憾。

还有就是编程时,可能要考虑很多年的历谱,进行统一调整。

至少要把前一年,后一年的历谱都考虑进去(因为我们事先不知道缺月在哪个年份。),程序的难度可能要稍稍增加吧。

 

等哪位编程爱好者,试编一个新程序来让大家试用。

 

 

以秋分为界估计就没问题了。不过这话不好讲。 不过,这个缺陷,只有三年,若按现在农历走(不是太合理),需要增加递减规则(老二做老大,老三做老二,庶出老三做老三)。事情变复杂了,需要选择到底是递增还是递减。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
txwdx
  33楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2011/12/31 12:36:00

若不顾时节的合理性,可以这样表述。

一、日/月/节气依目前准则。

二、值气:一个月有一个节气的,该节气为当月的值气;一个月有两个节气的,中气为当月的值气;一个月有三个节气的,中间一个节气为当月的值气。

三、雨水或惊蛰值正月,春分或清明值二月,...,冬至或小寒值冬月,大寒或立春值腊月。

四、有二个同名月份的,第二个为闰月。

五、正月初一到下一个正月初一前一天为一年,如果某年内既有闰月又有缺月,闰月在前的,闰月到缺月前一月月号递增一位;缺月在前的,缺月后一月到闰月前一月月号递减一位。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
浪-淘-沙
  34楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:2068 积分:4263 威望:5 精华:4 注册:2008/11/13 21:03:00
  发帖心情 Post By:2011/12/31 13:47:00

以下是引用txwdx在2011-12-31 12:36:00的发言:
若不顾时节的合理性,可以这样表述。
一、日/月/节气依目前准则。
二、值气:一个月有一个节气的,该节气为当月的值气;一个月有两个节气的,中气为当月的值气;一个月有三个节气的,中间一个节气为当月的值气。
三、雨水或惊蛰值正月,春分或清明值二月,...,冬至或小寒值冬月,大寒或立春值腊月。
四、有二个同名月份的,第二个为闰月。
五、正月初一到下一个正月初一前一天为一年,如果某年内既有闰月又有缺月,闰月在前的,闰月到缺月前一月月号递增一位;缺月在前的,缺月后一月到闰月前一月月号递减一位。

时节的合理性,不能过分强求,只要你使用了“中气”“节气”概念。

 

能保证尽量少的年份出偏差,就算改版有效吧。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
s333123s
  35楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:36 积分:306 威望:0 精华:0 注册:2011/12/28 16:48:00
  发帖心情 Post By:2011/12/31 16:18:00

谢谢楼主啦。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
txwdx
  36楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2011/12/31 23:38:00

以下是引用浪-淘-沙在2011-12-31 12:11:00的发言:

这一条是我所担心的。(好像我前面提到过了。)

因为理论上讲,历谱是每年推出一本的。(《中国天文历年》也一样,每年只提供一个版本,第二年的版本,到时候继续推算。不能提前计算,或许是担心出现天象大变吧。)

你颁布了今年的历谱后,到了年底,发现明年的历谱有缺陷,然后再改今年的历谱。似乎不好办了。

 

当然了,用电脑程序,一下子可以计算前后几千年的历谱,理论上讲,是可以事先调整好历谱的。只是这个缺陷,有点遗憾。

还有就是编程时,可能要考虑很多年的历谱,进行统一调整。

至少要把前一年,后一年的历谱都考虑进去(因为我们事先不知道缺月在哪个年份。),程序的难度可能要稍稍增加吧。

 

等哪位编程爱好者,试编一个新程序来让大家试用。

 

 

编程,算法自然是要重构。
初步想来,
算农历
1、某个特定日期转流水日。
2、流水日转流水农历历月
3、流水农历历月初一转流水节气号
4、下一个流水农历历月初一转流水节气号
5、计算值月节气
6、计算该节气年立春节气的农历流水月号
7、计算该立春所在农历流水月的值月节气
8、判断该月的值月节气是否雨水,取得年首农历流水月号
9、计算下一个节气年立春节气的农历流水月号
10、计算该立春所在的农历流水月的值月节气
11、判断该月的值月节气是否立春或大寒,取得年末农历流水月号
12、分别计算从年首到年末各个农历流水月的值月节气,取得各个流水月的年内月号
13、取得闰月、缺月前后月的流水月号
14、对各月的年内月号进行修正
15、取得年(第7步)、月、日(第3步)的番号
16、转换为特定格式输出日历/月历/年历
农历算其他历
1、取年号,算当年立春节气的流水日
2、算立春日对应的流水月号
3、计算立春所在农历流水月的值月节气
4、判断该月的值月节气是否雨水,取得年首农历流水月号
5、计算该立春所在农历流水月的值月节气
6、判断该月的值月节气是否雨水,取得年首农历流水月号
7、计算下一个节气年立春节气的农历流水月号
8、计算该立春所在的农历流水月的值月节气
9、判断该月的值月节气是否立春或大寒,取得年末农历流水月号
10、分别计算从年首到年末各个农历流水月的值月节气,确定当年是否有闰
11、计算年内流水月号
12、计算流水月号,并将目标农历日期转换成流水月日
13、将流水月日转换为流水日
14、流水日换算成相应的其他历法日期
15、转换为特定格式输出日历/月历/年历
ps:
流水月号:从某个特定日期开始的月数
流水节气号:从某个特定日期开始的节气数
呵呵,首先得选一个立春和正月初一重合的日子作为“特定日期”
[此贴子已经被作者于2012-1-1 15:23:20编辑过]

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
txwdx
  37楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2012/1/1 0:07:00

呵呵,看来1924年2月5日(2423821、甲寅)是个好日子。

岁逢甲子,又是立春逢春节

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
txwdx
  38楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2012/1/1 12:22:00


function Date2Lunardate(ymd)
{
var days = Date2Days(ymd);
var monthdays = Days2Monthdays(days);
var keysolar = Monthdays2Keysolar(monthdys);
var spring = keysolar - (keysolar % 24);
spring <<= 4;
var springdays = Solardays2Days(spring);
var firstmonth = Days2Monthdays(springdays);
keysolar = Monthdays2Keysolar(firstmonth);
firstmonth >>>=5;
if((keysolar % 24) != 1)firstmonth++;
spring += 384;
var springdays = Solardays2Days(spring);
var lastmonth = Days2Monthdays(springdays);
keysolar = Monthdays2Keysolar(lastmonth);
lastmonth >>>=5;
if((keysolar % 24) == 1)lastmonth--;
var leap = 0 , vacancy = 0 , calendarmonth = 0 , months;
for(int i=firstmonth; i=lastmonth;i++)
{
months = i << 5;
keysolar = Monthdays2Keysolar(months);
switch((((keysolar + 1) % 24) >>> 1) - calendarmonth)
{
case 0 : {leap = (((keysolar + 1) % 24) >>> 1);break;}
case 2 : {vacancy = (((keysolar + 1) % 24) >>> 1)-1;calendarmonth = (((keysolar + 1) % 24) >>> 1);break;}
default : {calendarmonth = (((keysolar + 1) % 24) >>> 1);break;}
}}
keysolar = Monthdays2Keysolar(monthdys);
if(vacancy)
{
if(leap > vacancy)
{
if(((((keysolar + 1) % 24) >>> 1) > vacancy) && ((((keysolar + 1) % 24) >>> 1) < leap) calendarmonth = (((keysolar + 1) % 24) >>> 1) - 1;
else if(((((keysolar + 1) % 24) >>> 1) = leap) && ((((keysolar + 1) % 24) % 2) =1)) calendarmonth = (((keysolar + 1) % 24) >>> 1) - 1;
else calendarmonth = (((keysolar + 1) % 24) >>> 1);
}
else
{
if(((((keysolar + 1) % 24) >>> 1) > leap) && ((((keysolar + 1) % 24) >>> 1) < vacancy) calendarmonth = (((keysolar + 1) % 24) >>> 1) + 1;
else if(((((keysolar + 1) % 24) >>> 1) = leap) && ((((keysolar + 1) % 24) % 2) =1)) calendarmonth = (((keysolar + 1) % 24) >>> 1) + 1;
else calendarmonth = (((keysolar + 1) % 24) >>> 1);
}
}
else if(leap)
{
if(((((keysolar + 1) % 24) >>> 1) = leap) && ((((keysolar + 1) % 24) % 2) =1)) calendarmonth = (((keysolar + 1) % 24) >>> 1) + 100;
else calendarmonth = (((keysolar + 1) % 24) >>> 1);
}
else calendarmonth = (((keysolar + 1) % 24) >>> 1);
var year = (keysolar - 1- ((keysolar - 1) % 24) / 24;
return ((year * 100000) + (month * 100) + (monthdays & 0x1f) + 1); //lunar date format: yyyylmmdd;
}
function Monthdays2Keysolar()
{
var month1stday = monthdays & 0xffe0;
var firstday = Monthdays2Days(month1stday);
var solardays = Days2Solardays(firstdays-1);
var solar1 = solardays >>> 4;
month1stday += 0x20;
firstday = Monthdays2Days(month1stday);
solardays = Days2Solardays(firstdays);
var solar2 = solardays >>> 4;
switch(solar2-solar1)
{
case 1: {return solar2;break;}
case 3: {return solar2-1;break;}
default: {return ((solar2 % 2) = 1 ? solar2 : solar2-1);break;}
}
}

function Lunardate2Monthdays(ylmd)
{
var year = (ylmd - (ylmd % 100000)) / 100000 - 1924;
var spring = year * 24;
spring <<= 4;
var springdays = Solardays2Days(spring);
var firstmonth = Days2Monthdays(springdays);
var keysolar = Monthdays2Keysolar(firstmonth);
firstmonth >>>= 5;
if((keysolar % 24) != 1) firstmonth++;
spring += 384;
springdays = Solardays2Days(spring);
var lastmonth = Days2Monthdays(springdays)
keysolar = Monthdays2Keysolar(lastmonth);
lastmonth >>>= 5;
if((keysolar % 24) == 1) lastmonth--;
var leap = 0 , vacancy = 0 , calendarmonth = 0 , months;
for(int i=firstmonth; i=lastmonth;i++)
{
months = i << 5;
keysolar = Monthdays2Keysolar(months);
switch((((keysolar + 1) % 24) >>> 1) - calendarmonth)
{
case 0 : {leap = (((keysolar + 1) % 24) >>> 1);break;}
case 2 : {vacancy = (((keysolar + 1) % 24) >>> 1)-1;calendarmonth = (((keysolar + 1) % 24) >>> 1);break;}
default : {calendarmonth = (((keysolar + 1) % 24) >>> 1);break;}
}
}
var month = ((ylmd % 10000) - ((ylmd % 10000) % 100)) / 100 - 1;
var leapflag = ((ylmd % 100000) - ((ylmd % 100000) % 10000)) / 10000;
if(leap && (! vacancy )){
if(leapflag) month++;
else if(month > leap) month++;}
month += firstmonth;
return (month << 5) + (ylmd % 100);}

function Lunardate2Days(ylmd){
var monthdays = Lunardate2Monthdays(ylmd);
return Monthdays2Days(monthdays);}

function Date2Days(ymd)//公历日期转流水日
{
}
function Days2Date(days)//公历日期转流水日
{
}
function Days2Monthdays(days)//流水日转流水月日
{
}
function Monthdays2Days(monthdays)//流水月日转流水日
{
}
function Days2Solardays(days)//流水日转流水气日
{
}
function Solardays2Days(solardays)//流水气日转流水日
{
}

[此贴子已经被作者于2012-1-1 15:26:54编辑过]

版主评定:好评,获得10个金币奖励好评,获得10个金币奖励
(理由:奖励)
支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
txwdx
  39楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 帖子:496 积分:2143 威望:0 精华:0 注册:2010/2/16 19:15:00
  发帖心情 Post By:2012/1/2 11:10:00

流水日/流水月日互转、流水日/流水气日互转,需要天文算法,目前还没弄明白。高手的进。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
浪-淘-沙
  40楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:2068 积分:4263 威望:5 精华:4 注册:2008/11/13 21:03:00
  发帖心情 Post By:2012/1/2 11:48:00

以下是引用txwdx在2012-1-2 11:10:00的发言:
流水日/流水月日互转、流水日/流水气日互转,需要天文算法,目前还没弄明白。高手的进。

其实,“星历”计算,可以参考《寿星天文历》相应的开源代码。

 

从编程角度讲,“星历”是第一步,计算出“节气日期时刻”“朔日期时刻”,就可以排历谱了。

后面的那些日月气的转换,其实算不上“天文计算”了。

 

如果直接用“程序代码”表示,嫌麻烦,可能试着用“伪代码”来表述。

每一步都写清楚了,编程高手们一看,就可以换成他们熟悉的“语言”。

 

请试着先用“伪代码”来描述你的编程思路吧。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
总数 68 上一页 1 2 3 4 5 6 7 下一页

返回版面帖子列表

新阴阳历








签名