中华农历论坛知识讨论区历法知识 → [讨论]对农历来说,两个功能相似的函数用同一参数来测试,结果相差一秒,履误差还是错误呢


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

主题:[讨论]对农历来说,两个功能相似的函数用同一参数来测试,结果相差一秒,履误差还是错误呢

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


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
[讨论]对农历来说,两个功能相似的函数用同一参数来测试,结果相差一秒,履误差还是错误呢  发帖心情 Post By:2011/2/12 21:15:00

var JD={ //日期元件
  JD:function(y,m,d){ //公历转儒略日
   var n=0, G=0;
   if(y*372+m*31+int2(d)>=588829) G=1; //判断是否为格里高利历日1582*372+10*31+15
   if(m<=2) m+=12, y--;
   if(G) n=int2(y/100), n=2-n+int2(n/4); //加百年闰
   return int2(365.25*(y+4716)) + int2(30.6001*(m+1))+d+n - 1524.5;
  },
  DD:function(jd){ //儒略日数转公历
   var r=new Object();
   var D=int2(jd+0.5), F=jd+0.5-D, c;  //取得日数的整数部份A及小数部分F
   if(D>=2299161) c=int2((D-1867216.25)/36524.25),D+=1+c-int2(c/4);
   D += 1524;               r.Y = int2((D-122.1)/365.25);//年数
   D -= int2(365.25*r.Y);   r.M = int2(D/30.601); //月数
   D -= int2(30.601*r.M);   r.D = D; //日数
   if(r.M>13) r.M -= 13, r.Y -= 4715;
   else       r.M -= 1,  r.Y -= 4716;
   //日的小数转为时分秒
   F*=24; r.h=int2(F); F-=r.h;
   F*=60; r.m=int2(F); F-=r.m;
   F*=60; r.s=F;
   return r;
  },
  DD2str:function(r){ //日期转为串
   var Y="     "+r.Y, M="0"+r.M, D="0"+r.D;
   var h=r.h, m=r.m, s=int2(r.s+.5);
   if(s>=60) s-=60,m++;
   if(m>=60) m-=60,h++;
   h="0"+h; m="0"+m; s="0"+s;
   Y=Y.substr(Y.length-5,5); M=M.substr(M.length-2,2); D=D.substr(D.length-2,2);
   h=h.substr(h.length-2,2); m=m.substr(m.length-2,2); s=s.substr(s.length-2,2);
   return Y+"-"+M+"-"+D+" "+h+":"+m+":"+s;
  },
  JD2str:function(jd){ //JD转为串
   var r=this.DD( jd );
   return this.DD2str( r );
  },


  Y:2000, M:1, D:1, h:12, m:0, s:0,
  toJD:function(){ return this.JD( this.Y, this.M, this.D+((this.s/60+this.m)/60+this.h)/24 ); }, //公历转儒略日
  setFromJD:function(jd){  var r=this.DD(jd); this.Y=r.Y, this.M=r.M, this.D=r.D, this.m=r.m, this.h=r.h, this.s=r.s;  }, //儒略日数转公历

  timeStr:function(jd){ //提取jd中的时间(去除日期)
   var h,m,s;
   jd+=0.5; jd = (jd - int2(jd));
   s=int2(jd*86400+0.5);
   h=int2(s/3600); s-=h*3600;
   m=int2(s/60);   s-=m*60;
   h="0"+h; m="0"+m; s="0"+s;
   return h.substr(h.length-2,2)+':'+m.substr(m.length-2,2)+':'+s.substr(s.length-2,2);
  },

}

 

用同一个儒略日参数来测试 JD2str()  与  timeStr ()   发现,两个结果的秒位不相同,相差一秒,不知是属于正的常的误差,还是必须纠正的错误。


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


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2011/2/12 21:16:00

以上代码来自寿星万年 历源码文档

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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2011/2/13 12:24:00

timestr()

函数进行了四舍五入操作。


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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2011/2/13 12:28:00

与时间日期有关的,大多不需进行四舍五入,用于纪事。

 

与天象发生时刻计算相关,我的软件计算中常常采用四舍五入计算。如日月食计算。

当然,很多时候,我并没有严格匹分“四舍五入”造成的影响。


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


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

以下是引用xjw01在2011-2-13 12:28:00的发言:

与时间日期有关的,大多不需进行四舍五入,用于纪事。

 

与天象发生时刻计算相关,我的软件计算中常常采用四舍五入计算。如日月食计算。

当然,很多时候,我并没有严格匹分“四舍五入”造成的影响。

纪事用的日期,确实不好“四舍五入”。

2010年12月31日23:59:59.9,如果“进位”,就是2011年的1月1日。

虽然不过是0.1秒之差,但却可能“相隔”一年了。

 

这个问题对于农历来说也很重要。如果冬至交节时刻正好处于这个尴尬位置,有可能会使得闰月的位置发生大的偏差。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

[讨论]对农历来说,两个功能相似的函数用同一参数来测试,结果相差一秒,履误差还是错误呢








签名