具体的计算过程涉及很多立体几何,我不方便都写进来,大概思路是用日期计算太阳直射点纬度或者太阳直射方向与赤道面所成的角,用这个角度计算昼夜分界线与观察点所在地纬度小圆的交点,用交点计算小圆上的夜弧(或昼弧)的圆心角,再除以地球自转角速度求出夜长(或昼长),下面是计算结果:
夜长 = 86400 * acos(h * tan(an) / r) / PI,单位为秒
其中acos为反余弦函数,PI为圆周率,
r = R * cos(la)
h = R * sin(la),其中R为地球半径,la为观察点纬度,
an = acos(1 - cos(td)^2 * sin(a0)^2),
其中,td为地球在公转轨道上从夏至起转过的角度(可以用日期求出来),a0为北回归线纬度23.5度,^2表示平方.
上述结果适用于北半球春分到秋分时段,其他情况都可以用类似的方法得出,只有一些正负号的区别.
上述结果假定海拔为0,如果要考虑海拔的影响,计算会变得复杂一些,但从实用的角度来看,现实中存在的海拔(正负一万米之内)对计算结果的影响非常小,因此忽略.