代码参考
源代码有几次错误,已经改成可以使用的C版本,计算结果和查询网站的结果会有1分钟左右的误差。
测试网站地址日出日落时间查询 - 国旗标准升降时间
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926
//定义全局变量
int days_of_month_1[] ={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int days_of_month_2[] ={ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
long double h = -0.833;
//输入日期
void input_date(int *c)
{
printf("Enter the date (form: 2009 03 10):\n");
scanf("%d %d %d",&c[0],&c[1],&c[2]);
}
//输入纬度
void input_glat(int *c)
{
printf("Enter the degree of latitude(range: 0°- 60°,form: 40 40 40 (means 40°40′40″)):\n");
scanf("%d %d %d",&c[0],&c[1],&c[2]);
}
//输入经度
void input_glong(int *c)
{
printf("Enter the degree of longitude(west is negativ,form: 40 40 40 (means 40°40′40″)):\n");
scanf("%d %d %d",&c[0],&c[1],&c[2]);
}
//判断是否为闰年:若为闰年,返回1;若非闰年,返回0
int leap_year(int year)
{
if ((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0)))
return 1;
else
return 0;
}
//求从格林威治时间公元2000年1月1日到计算日天数days
int days(int year, int month, int date)
{
int i, a = 0;
for (i = 2000; i < year; i++)
{
if (leap_year(i))
a = a + 366;
else
a = a + 365;
}
if (leap_year(year))
{
for (i = 0; i < month - 1; i++)
{
a = a + days_of_month_2[i];
}
}
else
{
for (i = 0; i < month - 1; i++)
{
a = a + days_of_month_1[i];
}
}
a = a + date;
return a;
}
//求格林威治时间公元2000年1月1日到计算日的世纪数t
double t_century(int days, double UTo)
{
return (( double) days + UTo / 360) / 36525;
}
//求太阳的平黄径
double L_sun( double t_century)
{
return (280.460 + 36000.770 * t_century);
}
//求太阳的平近点角
double G_sun( double t_century)
{
return (357.528 + 35999.050 * t_century);
}
//求黄道经度
double ecliptic_longitude( double L_sun, double G_sun)
{
return (L_sun + 1.915 * sin(G_sun * PI / 180)
+ 0.02 * sin(2 * G_sun * PI / 180));
}
//求地球倾角
double earth_tilt( double t_century)
{
return (23.4393 - 0.0130 * t_century);
}
//求太阳偏差
double sun_deviation( double earth_tilt,
double ecliptic_longitude)
{
return (180 / PI* asin(sin(PI / 180 * earth_tilt)* sin(PI / 180 * ecliptic_longitude)));
}
//求格林威治时间的太阳时间角GHA
double GHA( double UTo, double G_sun,
double ecliptic_longitude)
{
return (UTo - 180 - 1.915 * sin(G_sun * PI / 180)
- 0.02 * sin(2 * G_sun * PI / 180)
+ 2.466 * sin(2 * ecliptic_longitude * PI / 180)
- 0.053 * sin(4 * ecliptic_longitude * PI / 180));
}
//求修正值e
double e( double h, double glat, double sun_deviation)
{
return 180 / PI* acos((sin(h * PI / 180)- sin(glat * PI / 180)* sin(sun_deviation * PI / 180))/ (cos(glat * PI / 180)* cos(sun_deviation * PI / 180)));
}
//求日出时间
double UT_rise( double UTo, double GHA, double glong,
double e)
{
return (UTo - (GHA + glong + e));
}
//求日落时间
double UT_set( double UTo, double GHA, double glong,
double e)
{
return (UTo - (GHA + glong - e));
}
//判断并返回结果(日出)
double result_rise( double UT, double UTo, double glong,
double glat, int year, int month, int date)
{
double d;
if (UT >= UTo)
d = UT - UTo;
else
d = UTo - UT;
if (d >= 0.1)
{
UTo = UT;
UT = UT_rise(UTo,
GHA(UTo, G_sun(t_century(days(year, month, date), UTo)),
ecliptic_longitude(
L_sun(t_century(days(year, month, date), UTo)),
G_sun(
t_century(days(year, month, date),
UTo)))), glong,
e(h, glat,
sun_deviation(
earth_tilt(
t_century(days(year, month, date),
UTo)),
ecliptic_longitude(
L_sun(
t_century(
days(year, month, date),
UTo)),
G_sun(
t_century(
days(year, month, date),
UTo))))));
result_rise(UT, UTo, glong, glat, year, month, date);
}
return UT;
}
//判断并返回结果(日落)
double result_set( double UT, double UTo, double glong,
double glat, int year, int month, int date)
{
double d;
if (UT >= UTo)
d = UT - UTo;
else
d = UTo - UT;
if (d >= 0.1)
{
UTo = UT;
UT = UT_set(UTo,
GHA(UTo, G_sun(t_century(days(year, month, date), UTo)),
ecliptic_longitude(
L_sun(t_century(days(year, month, date), UTo)),
G_sun(
t_century(days(year, month, date),
UTo)))), glong,
e(h, glat,
sun_deviation(
earth_tilt(
t_century(days(year, month, date),
UTo)),
ecliptic_longitude(
L_sun(
t_century(
days(year, month, date),
UTo)),
G_sun(
t_century(
days(year, month, date),
UTo))))));
result_set(UT, UTo, glong, glat, year, month, date);
}
return UT;
}
//求时区
int Zone( double glong)
{
int timeZone ;
int shangValue = (int)(glong / 15);
double yushuValue = glong - shangValue*15;
// printf("%lf\n",yushuValue);
if (yushuValue <= 7.5) {
timeZone = shangValue;
} else {
timeZone = shangValue +(glong > 0 ? 1 :-1);
}
return timeZone;
}
void output( double rise, double set, double glong)
{
if ((int) (60 * (rise / 15 + Zone(glong) - (int) (rise / 15 + Zone(glong))))< 10)
{
printf("The time at which the sun rises is %d:0%d \n",(int) (rise / 15 + Zone(glong)),
(int) (60* (rise / 15 + Zone(glong)- (int) (rise / 15 + Zone(glong)))));
}
else
{
printf("The time at which the sun rises is %d:%d \n",(int) (rise / 15 + Zone(glong)),
(int) (60* (rise / 15 + Zone(glong)- (int) (rise / 15 + Zone(glong)))));
}
if ((int) (60 * (set / 15 + Zone(glong) - (int) (set / 15 + Zone(glong))))< 10)
{
printf("The time at which the sun sets is %d:%d \n",(int) (set / 15 + Zone(glong)),
(int) (60* (set / 15 + Zone(glong)- (int) (set / 15 + Zone(glong)))));
}
else
{
printf("The time at which the sun sets is %d:%d \n",(int) (set / 15 + Zone(glong)),
(int) (60* (set / 15 + Zone(glong)- (int) (set / 15 + Zone(glong)))));
}
}
//打印结果
int main()
{
double UTo = 180.0;
int year, month, date;
double glat, glong;
int c[3];
// input_date(c);
year = 2020;
month =11;
date = 13;
printf("year=%d month=%d date=%d\n",year,month,date);
// input_glat(c);
// glat = c[0] + c[1] / 60 + c[2] / 3600;
glat=29.026046;
printf("glat=%lf\n",glat);
// input_glong(c);
// glong = c[0] + c[1] / 60 + c[2] / 3600;
glong=121.126078;
printf("glong=%lf\n",glong);
double rise, set;
rise = result_rise(UT_rise(UTo,GHA(UTo, G_sun(t_century(days(year, month, date), UTo)),ecliptic_longitude(L_sun(t_century(days(year, month, date),UTo)),G_sun(t_century(days(year, month, date),UTo)))), glong,e(h, glat,sun_deviation(earth_tilt(t_century(days(year, month, date),UTo)),ecliptic_longitude(L_sun(t_century(days(year, month,date),UTo)),G_sun(t_century(days(year, month,date),UTo)))))), UTo,glong, glat, year, month, date);
set = result_set(UT_set(UTo,GHA(UTo, G_sun(t_century(days(year, month, date), UTo)),ecliptic_longitude(L_sun(t_century(days(year, month, date),UTo)),G_sun(t_century(days(year, month, date),UTo)))), glong,e(h, glat,sun_deviation(earth_tilt(t_century(days(year, month, date),UTo)),ecliptic_longitude(L_sun(t_century(days(year, month,date),UTo)),G_sun(t_century(days(year, month,date),UTo)))))), UTo,glong, glat, year, month, date);
output(rise, set, glong);
// system("pause");
return 0;
}