上海石化交易平台现货:如何用VC编一个公历与农历互相转化的程序?谢谢!

来源:百度文库 编辑:高校问答 时间:2024/05/03 10:13:07

http://topic.csdn.net/t/20050127/16/3758556.html

http://topic.csdn.net/t/20040804/09/3239912.html

参考

农历中一种日月兼顾的历法,
月份是以月为历,
节气是以日为历,
地公转轨道是一个以太阳为一个焦点的椭圆,
以近日点为0度,以太阳为中心,
将地球公转所扫过的角度每十五度的界点所在日期便是一个节气。
(可以运用立体几何算出,春分秋分大阳直射赤道,地球任意一经纬处日夜时间相等;夏至冬至太阳直射回归线[假设地球是个圆球])
以上是基本知识,再分析一下代码。

代码1。
var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758)
//每年的正小寒点到各节期正节期点(即十五度倍数点)的分种数。
//地球公转每年都一样
//由于公转轨道是椭圆,故这个数列并不是准确的等差数列

代码2
//===== 某年的第n个节气为几日(从0小寒起算)
function sTerm(y,n) {
var offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[n]*60000 ) + Date.UTC(1900,0,6,2,5) )
return(offDate.getUTCDate())
}

31556925974.7为地球公转周期,是毫秒。(如果换算成天,是265.242199天,所以每四百年就有97个闰年,同样,我们也可以看到,如果这样做的话,一百三十万年后,我们的公历算法将有一天的误差)

( 31556925974.7*(y-1900) + sTermInfo[n]*60000 )----表示y年的第n个节气点(15倍数度点)距1900年的小寒点的毫秒数。
Date.UTC(1900,0,6,2,5)----表示1900年一年六日两点五分是正小寒点。
以上两者相加得到的是:y年的第n个节气点时点的int值
var offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[n]*60000 ) + Date.UTC(1900,0,6,2,5) )----得出毫秒对应的日期