summaryrefslogtreecommitdiffstats
path: root/src/calendar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/calendar.cpp')
-rw-r--r--src/calendar.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/calendar.cpp b/src/calendar.cpp
new file mode 100644
index 0000000..c81316a
--- /dev/null
+++ b/src/calendar.cpp
@@ -0,0 +1,120 @@
1// Encoding: UTF-8
2#include "calendar.h"
3
4double pi=3.14159265358979323846;
5double delta=5e-9;
6
7void Plus(Date &date)
8{
9 if(date.tm_mday<10)
10 {
11 date.tm_mday=20;
12 }
13 else
14 {
15 date.tm_mday=6;
16 date.tm_mon++;
17 }
18 return;
19}
20
21double fuck(double a,double b)
22{
23 while(b<0)
24 b+=360;
25 while(b>=360)
26 b-=360;
27 if(b==0)
28 {
29 return min(fabs(b),fabs(360-b));
30 }
31 else
32 {
33 return fabs(a-b);
34 }
35}
36
37int main()
38{
39 Date* date=new Date;
40 cout<<"Please input the year: "<<endl;
41
42 //时间确认
43 cin>>date->tm_year;
44 date->tm_year-=1900;//年份减去1900
45 //当年元旦零时
46 date->tm_mon=0;
47 date->tm_mday=1;
48 date->tm_hour=0;
49 date->tm_min=0;
50 date->tm_sec=0;
51
52 //输出年份
53 cout<<"Year: "<<date->tm_year+1900<<endl;
54
55 //计算当年二十四节气准确时刻
56 parameter p;
57 Julian julian;
58 time_t time;
59 //double dL;//dL为L对t导数
60 double t,t_end,t_middle;
61 double target;
62 char JieQi[24][10]={"小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"};
63 //date->tm_mday=6;
64 for(int i=0;date->tm_mon<12;Plus(*date),i++)
65 {
66 //转换为时间戳
67 time=mktime(date);
68 //暂时放弃牛顿迭代法
69 //t=julian.getJulianKiloYear(time);
70 //while(fuck(p.longitude(t),(double)i*15-75)>=1e-8)
71 //{
72 // dL=(p.longitude(t+delta)-p.longitude(t-delta))/(2*delta);
73 // t=t-p.longitude(t)/dL;
74 //}
75
76
77 //计算儒略千年数
78 t=julian.getJulianKiloYear(time);
79 t_end=julian.getJulianKiloYear(time+86400);
80 target=i*15-75;
81 if(target<0)
82 {
83 target+=360;
84 }
85
86 //二分法
87 while(p.sun_longitude(t)>target)
88 {
89 time-=86400;
90 t_end=t;
91 t=julian.getJulianKiloYear(time);
92 }
93 while(p.sun_longitude(t_end)<=target)
94 {
95 time+=86400;
96 t=t_end;
97 t_end=julian.getJulianKiloYear(time);
98 }
99 while(t_end-t>=1e-10)
100 {
101 t_middle=(t+t_end)/2;
102 if(p.sun_longitude(t_middle)>target)
103 {
104 t_end=t_middle;
105 }
106 else
107 {
108 t=t_middle;
109 }
110 }
111 //double t转为时间戳
112 time=julian.kiloYearToTime(t,date->tm_year+1900);
113
114 //date换新
115 date=localtime(&time);
116 printf("%d-%02d-%02d %02d:%02d:%02d %s\n",date->tm_year+1900,date->tm_mon+1,date->tm_mday,date->tm_hour,date->tm_min,date->tm_sec,JieQi[i]);
117 }
118 printf("\n\n");
119 return 0;
120}