C语言 根据经纬度如何获取日落日出时间

这是一个使用C语言编写的程序,能够根据输入的日期、经纬度计算日出和日落时间。程序中包含了闰年的判断、日期处理、地理坐标转换等关键算法,并通过不断迭代调整结果以减小误差。最终,程序会输出格林威治标准时间的日出和日落时间,并转换为当地时区的时间。
摘要由CSDN通过智能技术生成

    代码参考

    利用日期、经纬度求日出日落时间 C语言程序代码_百度知道

    源代码有几次错误,已经改成可以使用的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;
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值