搜索
bottom↓
回复: 59

通过经纬度计算日出日落时间!给个思路吧

[复制链接]

出0入0汤圆

发表于 2007-9-2 14:20:24 | 显示全部楼层 |阅读模式
如题!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-9-2 17:12:23 | 显示全部楼层
做什么用?

出0入137汤圆

发表于 2007-9-2 17:27:34 | 显示全部楼层
每个城市都有日出日落时间表啊

出0入148汤圆

发表于 2007-9-2 18:10:39 | 显示全部楼层
这条式不知道可不可行:



sin(h)=sin(δ)sin(Φ)+cos(δ)cos(Φ)cos(τ)



其中h为太阳高度角,δ为太阳赤纬,即太阳直射点纬度,τ为时角,Φ为纬度



取h为0,查表得太阳赤纬,算出τ,然后通过τ算时间,τ 12时为0',向前一小时+15',向后一小时减15'



具体的记得不是很清楚,如果觉得可行就出查查

出0入0汤圆

发表于 2007-9-2 19:32:13 | 显示全部楼层
我也想写一个这样的程序,不知道去哪查,请楼上的说具体点,谢谢。

出0入0汤圆

发表于 2007-9-2 19:56:28 | 显示全部楼层
好像比较复杂啊,地球轨道是椭圆的,用公式的话结果不一定准确。。不过由些网站有这些小控件显示出来可以去查一下源代码,万一查不到到国旗护卫队咨询一下吧。

出0入148汤圆

发表于 2007-9-2 20:38:27 | 显示全部楼层
to: 【4楼】 zxw2008

    细想一下发觉上面方法似乎并不可行,上面只是理论上太阳高度角为0时的时间



    刚刚搜了一下,不知道这两个可不可以

    http://www.laogu.com/wz_1385.htm

    http://www.pdweather.com/pro/richu.html

出0入0汤圆

发表于 2007-9-3 04:35:08 | 显示全部楼层
吾所在地方四面环山,时间至少要有15分钟修正。

出0入0汤圆

 楼主| 发表于 2007-9-3 11:11:42 | 显示全部楼层
网上找来找去就这一篇,可惜我看不太懂

下面是一种随经纬度变化的日出日落时间计算方法,我成功运用在一智能路灯控制器中,希望对需要的朋友有帮助。

已知:日出日落时太阳的位置h=-0.833°,要计算地的地理位置,经度Long,纬度G1at,时区zone,UTo为上次计算的日出日落时间,第一次计算时UTo=180°。



(1)先计算出从格林威治时间公元2000年1月1日到计算日天数days;



(2)计算从格林威治时间公元2000年1月1日到计算日的世纪数t,



则        t=(days+UTo/360)/36525;



(3)计算太阳的平黄径   L=280.460+36000.770×t;



(4)计算太阳的平近点角



G=357.528+35999.050×t



(5)计算太阳的黄道经度



λ=L+1.915×sinG+0.020xsin(2G);



(6)计算地球的倾角  ε=23.4393-0.0130×t;



(7)计算太阳的偏差  δ=arcsin(sinε×sinλ);



(8)计算格林威治时间的太阳时间角GHA:



    GHA=UTo-180-1.915×sinG-0.020×sin(2G) +2.466×sin(2λ)-0.053×sin(4λ)



(9)计算修正值e:



    e=arcos{[ sinh-sin(Glat)sin(δ)]/cos(Glat)cos(δ)}



(10)计算新的日出日落时间



UT=UTo-(GHA+Long±e);



其中“+”表示计算日出时间,“-”表示计算日落时间;



(11)比较UTo和UT之差的绝对值,如果大于0.1°即0.007小时,把UT作为新的日出日落时间值,重新从第(2)步开始进行迭代计算,如果UTo和UT之差的绝对值小于0.007小时,则UT即为所求的格林威治日出日落时间;



(12)上面的计算以度为单位,即180°=12小时,因此需要转化为以小时表示的时间,再加上所在的时区数Zone,即要计算地的日出日落时间为



T=UT/15+Zone



上面的计算日出日落时间方法适用于小于北纬60°和南纬60°之间的区域,如果计算位置为西半球时,经度Long为负数。

出0入0汤圆

发表于 2007-9-3 12:51:00 | 显示全部楼层
海拔不同怎么样办?

出0入0汤圆

发表于 2007-9-3 13:38:47 | 显示全部楼层
我以前做过一个太阳能面板的向阳功能,里面需要每日每个时刻的太阳高度角,这里面当然有日出日落时间,本来我也想要算法,但是后来发现用这个算法的速度还不及查表……浮点运算太耗资源,看你的要求了,一年也就356个数据。具体的数据可以在建筑相关领域去查找,都有的,因为建筑师要用这个表来确定建筑的朝向。

当然你不是作产品而是做一个程序玩玩,那就当我没说。

出0入0汤圆

发表于 2007-9-3 19:43:21 | 显示全部楼层
是没有必要计算的。路灯可以用查表来搞定,不用很精确,不过最好加上感光控制。太阳能感光板也是加上表格,如果要求很高再用传感器来检测是否垂直入射,来不断调整即可。

出0入0汤圆

发表于 2007-9-4 14:34:02 | 显示全部楼层
好像外国的某个网站有

出0入0汤圆

发表于 2008-2-16 22:12:11 | 显示全部楼层
http://www.cng.com.cn/bbs/printpage.asp?BoardID=34&ID=12002
--  计算昼夜长短、日出日落时间的通式

下面是一个计算任意地方在任意一天昼夜长短、日出日落时间的通式,不知道正确不正确,现在贴出来,请大家批评指正。

假设某天太阳直射的纬度为M度(M在+23.5到-23.5之间),观察者所处的纬度为N度(N在+90到-90之间),那么这天N度地点的夜长为:

T=(2/15)arccos(tgMtgN) 小时……(1)

(说明:如果人在北半球,太阳在南半球,则M应该取负值,那么结果也是负值,该值表示的是北半球那人所看到的昼长。)

日出时刻为arccos(tgMtgN)/15 (当地时刻)……(2)

日落时刻为24-arccos(tgMtgN)/15 (当地时刻)……(3)

例如,要计算北京在夏至这一天的夜长,已知北京在北纬40度,即N=40,夏至这天太阳直射北纬23.5度,即M=23.5,把N和M的值代入(1)式,可计算出这天北京的夜长为9.15小时。

上面的公式中,M和N的地位等同,所以在一定范围内可互换。比方说,某人在北纬20度、太阳在北纬10度与某人在北纬10度、太阳在北纬20度的昼夜长短一样,日出日落时刻也一样。

用上面的公式(1)也可以计算某天极昼和极夜出现的纬度。例如计算太阳在北纬M度这一天,北极出现极昼的纬度。把T=0代入(1)式,可以得到N=90-M 。就是说,当太阳在北纬20度时,北极出现极昼的最低纬度是北纬70度;当太阳在北回归线(北纬23.5度)这一天,北极出现极昼的最低纬度是北纬66.5度。当然,因为地球两极略扁,不是个标准球,所以计算结果比实际值略大。


上面的公式是在简化的理想条件下得到的,所以是个近似值。简化理想条件是:1假设地球是个标准球体;2 忽略人的身高 3 假设每天太阳的轨迹圆是相互平行的(实际上太阳的轨迹圆不是平行的,是弹簧状,所以早上太阳升起的纬度和落下的纬度不同,上午和下午的长短也不同)。

这个公式只能供我们参考用,不能教给学生,因为还没经国家同意,所以考试时一旦与标准答案不同,我不负责。

对三角函数已经陌生了,不知道上面的公式还能不能继续简化。如果谁还有更好的公式请贴出来,共享

出0入0汤圆

发表于 2008-2-17 02:26:50 | 显示全部楼层
这么复杂的计算,8位单片机能吃得消吗?

出0入0汤圆

发表于 2008-2-17 11:13:54 | 显示全部楼层
这是我写的一个用于太阳能电板追日的,希望对你有用


#include <math.h>
#define PI 3.1415926
struct in
{
unsigned int jingdu;
unsigned int jingfeng;
unsigned int weidu;
unsigned int weifeng;
unsigned int year;
unsigned char  month;
unsigned char day;
unsigned char hour;
unsigned char mintue;
}  data_in;

float n0;
float  temp0;
float  temp1;
unsigned long int total_day;   //积日
float  dz_jingdu;                      //经度订正
float  dz_sk;               //时刻订正
float  temp2;
float degree_sun;
float Er,Ed,Et,Sd;
float SD_sun,h_sun,a_sun,a_sun_up,a_sun_down;
  float temp3,temp4;
void main(void)
{
  data_in.jingdu =120;
   data_in.jingfeng=57;
   data_in.weidu=31;
   data_in.weifeng=22;
   data_in.year=2006;
   data_in.month=11;
   data_in.day=7 ;
   data_in.hour=6;
   data_in.mintue=21;

n0 = 79.6764 + 0.2422 * (data_in.year-1985)-(int)((data_in.year- 1985)/4);
temp0= data_in.year/4.0-(int)(data_in.year/4);  
temp1=32.8 ;
if( data_in.month <=2)
       temp1=30.6;
else
      {
       if(temp0==0)
            temp1=32.8 ;
      }
total_day = (int) (30.6 * data_in.month -  temp1 + 0.5) +data_in.day ;   

dz_jingdu =(data_in.jingdu+data_in.jingfeng/ 60.0) / 15  ;        
dz_sk = data_in.hour-8+data_in.mintue/60.0 ;
  temp2= total_day+(dz_sk -dz_jingdu)/24.0 ;
  degree_sun=2*PI*( total_day-n0)/365.2422;
   
Er=1.000423 + 0.032359*sin(degree_sun)+ 0.000086*sin(2*degree_sun)- 0.008349*cos(degree_sun)+ 0.000115*cos(2*degree_sun);
Ed=0.3723 + 23.2567*sin(degree_sun)+ 0.1149*sin(2*degree_sun)-0.1712*sin(3*degree_sun)- 0.758*cos(degree_sun)+ 0.3656*cos(2*degree_sun)+ 0.0201*cos(3*degree_sun);
Et=0.0028 - 1.9857*sin(degree_sun)+ 9.9059*sin(2*degree_sun)- 7.0924*cos(degree_sun)- 0.6882*cos(2*degree_sun);
Sd=data_in.hour+(data_in.mintue-(120.0-(data_in.jingdu+data_in.jingfeng/60.0))*4)/60.0;    //当地太阳时间
SD_sun= (Sd+Et/60.0-12)*15;       //当地太阳角度
  
temp3=2*PI*(data_in.weidu+data_in.weifeng/60.0)/360;
temp1=2*PI*Ed/360;
temp2=2*PI*SD_sun/360;
temp4=sin(temp1)*sin(temp3) +cos(temp1)*cos(temp3)*cos(temp2);
if(temp4>1)
   temp4=1;
else
   if(temp4<-1)
        temp4=-1;  
h_sun=asin(temp4);//太阳高度角

temp4=(sin(h_sun)*sin(temp3)-sin(temp1))/(cos(h_sun)*cos(temp3));
if(temp4>1)
   temp4=1;
else
   if(temp4<-1)
        temp4=-1;  
a_sun=acos(temp4);//太阳方位角
h_sun=h_sun*360/(2*PI);
a_sun=a_sun*360/(2*PI);

a_sun_up=acos(sin(temp1)/cos(temp3))*360/(2*PI);//日出方位
a_sun_down=a_sun_up-180; //日落方位

  
  }

出0入0汤圆

发表于 2008-2-17 12:00:40 | 显示全部楼层
我毕业设计就是搞得这个东西,用来模拟太阳能热发电系统的。

理论上是可以通过公式、经纬度、海拔高度准确计算出太阳的仰角和方位角,然后控制反射板将阳光反射到集热塔。当然计算日出日落时间也很简单了。我的处理方法是通过计算机来计算,然后传参数给单片机,由单片机去控制反射板。

国内国外资料有很多,可惜我的毕业设计给丢了,郁闷惨了。要不然可以给你参考的。

出0入0汤圆

发表于 2008-2-17 12:53:55 | 显示全部楼层
这个厉害!

出0入0汤圆

发表于 2008-2-17 17:17:10 | 显示全部楼层
介绍个叫"日棱万年历"的软件可做参考

出0入0汤圆

发表于 2008-2-17 21:17:16 | 显示全部楼层
光经纬度不成啊。还得地球半径。月份和日期。

出0入10汤圆

发表于 2008-2-17 21:20:54 | 显示全部楼层
不错,感兴趣。
但现在的气候与老黄历都对不上了,干脆自己定

出0入0汤圆

发表于 2008-2-19 08:22:16 | 显示全部楼层
记得灵图5和ROUTE66(GPS软件)都有GPS定位点的日出日落的信息,精确到秒,就是不知道怎么算的.

出0入0汤圆

发表于 2008-4-3 13:48:50 | 显示全部楼层
我以前在路灯节能上用过

如果要求不是很高,网上有各地的经纬度和日出日落时间可用

可以将不同城市、时间的数据写成数组存入程序存储区,再进行日出日落时间判断

出0入0汤圆

发表于 2008-4-3 13:58:39 | 显示全部楼层
关注中......

出0入0汤圆

发表于 2009-12-1 13:42:17 | 显示全部楼层
楼主~现在程序怎么样了?

出0入0汤圆

发表于 2009-12-13 10:35:37 | 显示全部楼层
程序计算起来的运算量比较大,一年也就356个数据,不如查表方便。

出0入0汤圆

发表于 2009-12-13 10:58:50 | 显示全部楼层
向日葵可没有什么查表程序!

如果简单,那就给设备装准直器把,实时跟踪太阳的位置移动,需要的或许仅仅是一个光敏电阻组成的探测阵列。

出0入0汤圆

发表于 2009-12-13 11:32:46 | 显示全部楼层
关注的mark

出0入0汤圆

发表于 2009-12-13 13:08:27 | 显示全部楼层
貌似在中学的时候就成功计算过了。
不过那个时候是按照海平面来算的,正巧我所在的城市海拔为0。呵呵比较幸运。

这个用农历算会比较准确一些,当然还要考虑到海拔的所造成的误差。

至于运算么~~,有一些地理知识,加上一些几何知识,还有三角函数就OK了。

出0入0汤圆

发表于 2009-12-15 08:48:14 | 显示全部楼层
15L的算法很耗资源,浮点数运算不是8位单片机承受的了的。我原来也是这么写的,最后还是改成了查表法,采了264个数据。纬度采了11个值,从5 - 55度,基本覆盖了中国。经度取北京的经度,其他经度以北京为基准换算,12个月每月采2次。误差在5min - 15min之间。

出0入0汤圆

发表于 2009-12-15 12:00:32 | 显示全部楼层
为什么8位机不能承受的了呢,你查表误差在5min - 15min之间,15L的算法是绝对不要5min - 15min那么久的.系统中单独放一个MEGA48负责计算,成本也还是可以接受的,误差绝对比查表小很多.
15L的算法已加入了误差,没办法,帮人家开发的东西,人家还在用的,所以只能留一手了.

出0入0汤圆

发表于 2009-12-15 12:01:37 | 显示全部楼层
为什么8位机不能承受的了呢,你查表误差在5min - 15min之间,15L的算法是绝对不要5min - 15min那么久的.系统中单独放一个MEGA48负责计算,成本也还是可以接受的,误差绝对比查表小很多.
15L的算法已加入了误差,没办法,帮人家开发的东西,人家还在用的,所以只能留一手了.

出0入0汤圆

发表于 2009-12-15 13:39:56 | 显示全部楼层
有个手机软件叫做手机指南针,就有这功能,可以试一下

出0入0汤圆

发表于 2010-3-7 19:47:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-7 20:38:38 | 显示全部楼层
呵呵,以前做太阳能热水器控制时,就用过计算日出日落时间,现在怎么都忘了,去找找看。

出0入0汤圆

发表于 2010-3-7 21:00:28 | 显示全部楼层
嗯,手机上有一个叫指南针的软件,指定经纬度和时区可以算出来,就不知道是怎么实现的。

出0入0汤圆

发表于 2010-4-20 16:06:50 | 显示全部楼层
回复【32楼】Paul  
-----------------------------------------------------------------------

浮点数运算很占资源,我用的是168,16Kram,一开始采取15L的浮点数运算,发现占了8Kram,这不是项目能承受的。当然如果再增加一个MCU专门负责运算也是可以的,不过这样就增加了成本。

出0入0汤圆

发表于 2010-4-21 12:04:08 | 显示全部楼层
参考寿星万年历吧,开源的。

出0入0汤圆

发表于 2010-6-26 17:26:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-27 09:57:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-27 22:09:00 | 显示全部楼层
回复【4楼】zxw2008
-----------------------------------------------------------------------

椭圆有椭圆轨迹方程啊?

出0入0汤圆

发表于 2010-12-1 15:23:21 | 显示全部楼层
留一爪子

出0入0汤圆

发表于 2011-4-9 21:09:35 | 显示全部楼层
现在怎么样了
支持一下

出0入0汤圆

发表于 2011-4-19 15:43:24 | 显示全部楼层
回复【8楼】caixiong 菜熊
-----------------------------------------------------------------------

大侠,我现在也做智能路灯的控制,那个随经纬度日出日落算法的C语言代码还有吗?跪求啊

出0入0汤圆

发表于 2011-6-7 13:04:17 | 显示全部楼层
mark!!!!!!

出0入0汤圆

发表于 2011-6-7 15:52:06 | 显示全部楼层
实际现在不用计算了,可以有一套系统,简单实用,跟中太阳回复【45楼】number007cool
-----------------------------------------------------------------------

出0入0汤圆

发表于 2011-6-7 17:05:33 | 显示全部楼层
关注

出0入0汤圆

发表于 2011-9-27 16:30:14 | 显示全部楼层
这个好玩儿

出0入0汤圆

发表于 2011-9-27 17:27:30 | 显示全部楼层
有点意思,以前有个这样的项目,后来飞了

出0入0汤圆

发表于 2014-6-18 15:43:47 | 显示全部楼层
本帖最后由 dachun 于 2014-6-18 15:49 编辑

最近正好有个项目需要这个功能,从CSDN下载的C代码,经过验证计算日出日落时间和网络查询偏差不超5分钟,也算精确了,可以结贴了吧!呵呵

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "math.h"
  5. #include "time.h"

  6. #define M_PI 3.14

  7. static double RAD = 180.0 * 3600 /M_PI;
  8. static double richu;
  9. static double midDayTime;
  10. static double dawnTime;
  11. static double jd;
  12. static double wd;
  13. static double jd_degrees;
  14. static double jd_seconds;
  15. static double wd_degrees;
  16. static double wd_seconds;
  17. /*************************
  18.      * 儒略日的计算
  19.      *
  20.      * @param y 年
  21.      *
  22.      * @param M 月
  23.      *
  24.      * @param d 日
  25.      *
  26.      * @param h 小时
  27.      *
  28.      * @param m 分
  29.      *
  30.      * @param s秒
  31.      *
  32.      * @return int
  33. ***************************/
  34. static double timeToDouble(int y, int M, double d)
  35. {
  36. //        double A=0;
  37.         double B=0;
  38.         double jd=0;

  39.         //设Y为给定年份,M为月份,D为该月日期(可以带小数)。
  40.         //若M > 2,Y和M不变,若 M =1或2,以Y–1代Y,以M+12代M,换句话说,如果日期在1月或2月,则被看作是在前一年的13月或14月。
  41.         //对格里高利历有 :A = INT(Y/100)   B = 2 - A + INT(A/4)
  42.         //对儒略历,取 B = 0
  43.         //JD = INT(365.25(Y+4716))+INT(30.6001(M+1))+D+B-1524.5 (7.1)
  44.         B=-13;
  45.         jd=floor(365.25 * (y + 4716))+ floor(30.60001 * (M + 1)) +B+ d- 1524.5;
  46.         return jd;
  47.   }

  48. static void doubleToStr(double time,char *str)
  49. {
  50.        double t;
  51.        int h,m,s;

  52.         t = time + 0.5;
  53.         t = (t - (int) t) * 24;
  54.         h = (int) t;
  55.         t = (t - h) * 60;
  56.         m = (int) t;
  57.         t = (t - m) * 60;
  58.         s = (int) t;
  59.         sprintf(str,"%02d:%02d:%02d",h,m,s);
  60. }

  61. /****************************
  62.      * @param t 儒略世纪数
  63.      *
  64.      * @return 太阳黄经
  65. *****************************/
  66. static double sunHJ(double t)
  67. {
  68.         double j;
  69.         t = t + (32.0 * (t + 1.8) * (t + 1.8) - 20) / 86400.0 / 36525.0;
  70.         // 儒略世纪年数,力学时
  71.         j = 48950621.66 + 6283319653.318 * t + 53 * t * t - 994 + 334166 *cos(4.669257 + 628.307585 * t) + 3489 * cos(4.6261 + 1256.61517 * t) + 2060.6 * cos(2.67823 + 628.307585 * t) * t;
  72.         return (j / 10000000);
  73. }

  74. static double mod(double num1, double num2)
  75. {
  76.         num2 = fabs(num2);
  77.         // 只是取决于Num1的符号
  78.         return num1 >= 0 ?(num1 - (floor(num1 / num2)) * num2 ): ((floor(fabs(num1) / num2)) * num2 - fabs(num1));
  79. }
  80. /********************************
  81.      * 保证角度∈(-π,π)
  82.      *
  83.      * @param ag
  84.      * @return ag
  85. ***********************************/
  86. static double degree(double ag)
  87. {
  88.         ag = mod(ag, 2 * M_PI);
  89.         if(ag<=-M_PI){
  90.             ag=ag+2*M_PI;
  91.         }
  92.         else if(ag>M_PI){
  93.             ag=ag-2*M_PI;
  94.         }
  95.         return ag;
  96. }

  97. /***********************************
  98.      *
  99.      * @param date  儒略日平午
  100.      *
  101.      * @param lo    地理经度
  102.      *
  103.      * @param la    地理纬度
  104.      *
  105.      * @param tz    时区
  106.      *
  107.      * @return 太阳升起时间
  108. *************************************/
  109. double sunRiseTime(double date, double lo, double la, double tz)
  110. {
  111.         double t,j,sinJ,cosJ,gst,E,a,D,cosH0,cosH1,H0,H1,H;
  112.         date = date - tz;
  113.         // 太阳黄经以及它的正余弦值
  114.         t = date / 36525;
  115.         j = sunHJ(t);
  116.         // 太阳黄经以及它的正余弦值
  117.         sinJ = sin(j);
  118.         cosJ = cos(j);
  119.         // 其中2*M_PI*(0.7790572732640 + 1.00273781191135448*jd)恒星时(子午圈位置)
  120.         gst = 2 * M_PI * (0.779057273264 + 1.00273781191135 * date) + (0.014506 + 4612.15739966 * t + 1.39667721 * t * t) / RAD;
  121.         E = (84381.406 - 46.836769 * t) / RAD; // 黄赤交角
  122.         a = atan2(sinJ * cos(E), cosJ);// '太阳赤经
  123.         D = asin(sin(E) * sinJ); // 太阳赤纬
  124.         cosH0 = (sin(-50 * 60 / RAD) - sin(la) * sin(D)) / (cos(la) * cos(D)); // 日出的时角计算,地平线下50分
  125.         cosH1 = (sin(-6 * 3600 / RAD) - sin(la) * sin(D)) / (cos(la) * cos(D)); // 天亮的时角计算,地平线下6度,若为航海请改为地平线下12度
  126.         // 严格应当区分极昼极夜,本程序不算
  127.         if (cosH0 >= 1 || cosH0 <= -1){
  128.             return -0.5;// 极昼
  129.         }
  130.         H0 = -acos(cosH0); // 升点时角(日出)若去掉负号 就是降点时角,也可以利用中天和升点计算
  131.         H1 = -acos(cosH1);
  132.         H = gst - lo - a; // 太阳时角
  133.         midDayTime = date - degree(H) / M_PI / 2 + tz; // 中天时间
  134.         dawnTime = date - degree(H - H1) / M_PI / 2 + tz;// 天亮时间
  135.         return date - degree(H - H0) / M_PI / 2 + tz; // 日出时间,函数返回值
  136.     }

  137. int main()
  138. {

  139.     time_t curtime;
  140.     struct tm * timeinfo;
  141.     int i,j,k;
  142.     char timestr[20];
  143.     int year;
  144.     int month;
  145.     double day;
  146.     int hour;
  147.     int min;
  148.     int sec;
  149.     int tz;
  150.     FILE *fp;


  151.     //上海东经121度29分,北纬31度14分
  152.     jd_degrees=121;
  153.     jd_seconds=28;
  154.     wd_degrees=31;
  155.     wd_seconds=14;
  156.    //乌鲁木齐东经87度35分,北纬43度48分
  157.     //jd_degrees=87;
  158.     //jd_seconds=35;
  159.     //wd_degrees=43;
  160.     //wd_seconds=48;
  161.     //广州 E113°16' N23°06'
  162.     //jd_degrees=113;
  163.     //jd_seconds=16;
  164.     //wd_degrees=23;
  165.     //wd_seconds=6;

  166.     tz=8;

  167.     //得到当前时间
  168.     time( &curtime );
  169.     timeinfo=localtime(&curtime);
  170.     printf ( "The current date/time is: %s", asctime(timeinfo));

  171.     //step 1
  172.     jd=-(jd_degrees+jd_seconds/60)/180*M_PI;
  173.     wd=(wd_degrees+wd_seconds/60)/180*M_PI;
  174.     printf("jd=%f\r\n",jd);
  175.     printf("wd=%f\r\n",wd);

  176.     //step 2
  177.     year=timeinfo->tm_year+1900;
  178.     month=timeinfo->tm_mon+1;
  179.     day=timeinfo->tm_mday;
  180.     hour=timeinfo->tm_hour;
  181.     min=timeinfo->tm_min;
  182.     sec=timeinfo->tm_sec;
  183.     richu = timeToDouble(year,month,day) - 2451544.5;
  184.     printf ( "mjd:%f\r\n", richu);
  185.     printf("year=%d,month=%d,day=%f\r\n",year,month,day);
  186.     for (i = 0; i < 10; i++){
  187.         richu = sunRiseTime(richu, jd, wd, tz/24.0);// 逐步逼近法算10次
  188.     }

  189.     doubleToStr(richu,timestr);
  190.     printf("日出时间 %s\r\n",timestr);

  191.     doubleToStr(midDayTime + midDayTime - richu,   timestr);
  192.     printf("日落时间 %s\r\n",timestr);
  193.     printf ( "richu:%f,midDayTime:%f\r\n", richu,midDayTime);

  194.     doubleToStr(midDayTime,timestr);
  195.     printf("中天时间 %s\r\n",timestr);

  196.     doubleToStr(dawnTime,timestr);
  197.     printf("天亮时间 %s\r\n",timestr);

  198.     doubleToStr(midDayTime + midDayTime - dawnTime,timestr);
  199.     printf("天黑时间 %s\r\n",timestr);


  200.     fp=fopen("richu.txt","w");
  201.     if(fp==NULL){
  202.         printf("file open error\r\n");
  203.     }

  204.     fclose(fp);
  205.     printf("Hello world!\n");
  206.     return 0;
  207. }
复制代码

出0入0汤圆

发表于 2016-2-10 08:26:51 来自手机 | 显示全部楼层
记号,经纬度计算日落时间

出0入0汤圆

发表于 2016-2-10 12:33:27 | 显示全部楼层
记号,经纬度计算日落时间

出0入0汤圆

发表于 2016-2-10 14:00:42 | 显示全部楼层
这个的确可以算出来的,我曾经给一个进口的叫做ce318的光度计设备破解协议,那个就是根据gps算当时的太阳位置跟高度,然后自动调节光筒对准太阳,原理未知

出0入0汤圆

发表于 2016-2-14 14:21:01 | 显示全部楼层
记号,经纬度计算日落时间

出0入0汤圆

发表于 2016-2-14 18:52:39 来自手机 | 显示全部楼层
记号,经纬度计算日落时间

出0入0汤圆

发表于 2016-2-14 19:05:38 | 显示全部楼层
可以向高中地理老师先请教原理

出0入0汤圆

发表于 2016-2-14 19:17:36 | 显示全部楼层
记号,经纬度计算日落时间.

出0入0汤圆

发表于 2016-5-12 23:10:07 | 显示全部楼层
谢谢楼主了。。。这么好的东西

出0入0汤圆

发表于 2016-5-13 04:45:23 来自手机 | 显示全部楼层
参考下,谢谢lz

出0入0汤圆

发表于 2020-11-3 22:55:30 | 显示全部楼层
dachun 发表于 2014-6-18 15:43
最近正好有个项目需要这个功能,从CSDN下载的C代码,经过验证计算日出日落时间和网络查询偏差不超5分钟,也 ...

不错,借鉴了,谢谢!~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 01:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表