diff options
Diffstat (limited to 'src/calendar.cpp')
-rw-r--r-- | src/calendar.cpp | 120 |
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 | |||
4 | double pi=3.14159265358979323846; | ||
5 | double delta=5e-9; | ||
6 | |||
7 | void 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 | |||
21 | double 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 | |||
37 | int 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 | } | ||