using
System;
using
System.Collections.Generic;
using
System.Globalization;
namespace
Common.ChineseLunisolarCalendar
{
class
ChineseAlmanac : System.Globalization.ChineseLunisolarCalendar
{
private
System.Globalization.ChineseLunisolarCalendar netCalendar
=
new
System.Globalization.ChineseLunisolarCalendar();
#region
加强
///
<summary>
///
获取该农历对象的属相。
///
</summary>
///
<returns>
0-11,如“鼠”为0
</returns>
public
string
GetAnimalSign(DateTime solarDateTime)
{
return
"
猪鼠牛虎兔龙蛇马羊猴鸡狗
"
.Substring(Zhi(GetChineseEraOfYear(solarDateTime)),
1
);
}
///
<summary>
///
获取年柱。
///
</summary>
public
int
GetChineseEraOfYear(DateTime solarDateTime)
{
int
g
=
(solarDateTime.Year
-
1900
+
36
)
%
60
;
if
((DayDifference(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day)
+
solarDateTime.Hour
/
24
)
<
Term(solarDateTime.Year,
3
,
true
)
-
1
)
{
//
判断是否过立春
g
-=
1
;
}
return
g
+
1
;
}
///
<summary>
///
获取月柱。
///
</summary>
public
int
GetChineseEraOfMonth(DateTime solarDateTime)
{
int
v
=
((solarDateTime.Year
-
1900
)
*
12
+
solarDateTime.Month
+
12
)
%
60
;
if
(solarDateTime.Day
<=
GetSolarTerm(solarDateTime)[
0
].SolarTermDateTime.Day)
v
-=
1
;
return
v
+
1
;
}
///
<summary>
///
获取日柱。
///
</summary>
public
int
GetChineseEraOfDay(DateTime solarDateTime)
{
double
gzD
=
(solarDateTime.Hour
<
23
)
?
EquivalentStandardDay(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day) : EquivalentStandardDay(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day)
+
1
;
return
(
int
)Math.Round((
double
)rem((
int
)gzD
+
15
,
60
));
}
///
<summary>
///
获取时柱。
///
</summary>
public
int
GetChineseEraOfHour(DateTime solarDateTime)
{
double
v
=
12
*
Gan(GetChineseEraOfDay(solarDateTime))
+
System.Math.Floor((
double
)((solarDateTime.Hour
+
1
)
/
2
))
-
11
;
if
(solarDateTime.Hour
==
23
)
v
-=
12
;
return
(
int
)Math.Round(rem(v,
60
));
}
///
<summary>
///
获取指定日期的节气。
///
</summary>
///
<param name="year">
要获取的年
</param>
///
<param name="month">
要获取的月
</param>
///
<returns></returns>
///
<remarks>
///
立春:立是开始的意思,春是蠢动,表示万物开始有生气,这一天春天开始。
///
雨水:降雨开始,雨水将多。
///
惊蛰:春雷响动,惊动蛰伏地下冬眠的生物,它们将开始出土活动。
///
春分:这是春季九十天的中分点,这一天昼夜相等,所以古代曾称春分秋分为昼夜分。
///
清明:明洁晴朗,气候温暖,草木开始萌发繁茂。
///
谷雨:雨生百谷的意思。雨水增多,适时的降雨对谷物生长很为有利。
///
立夏:夏天开始,万物渐将随温暖的气候而生长。
///
小满:满指籽粒饱满,麦类等夏热作物这时开始结籽灌浆,即将饱满。
///
芒种:有芒作物开始成熟,此时也是秋季作物播种的最繁忙时节。
///
夏至:白天最长,黑夜最短,这一天中午太阳位置最高,日影短至终极,古代又称这一天为日北至或长日至。
///
小暑:暑是炎热,此时还未到达最热。
///
大暑:炎热的程度到达高峰。
///
立秋:秋天开始,植物快成熟了。
///
处暑:处是住的意思,表示暑气到此为止。
///
白露:地面水气凝结为露,色白,是天气开始转凉了。
///
秋分:秋季九十天的中间,这一天昼夜相等,同春分一样,太阳从正东升起正西落下。
///
寒露:水露先白而后寒,是气候将逐渐转冷的意思。
///
霜降:水气开始凝结成霜。
///
立冬:冬是终了,作物收割后要收藏起来的意思,这一天起冬天开始。
///
小雪:开始降雪,但还不多。
///
大雪:雪量由小增大。
///
冬至:这一天中午太阳在天空中位置最低,日影最长,白天最短, 黑夜最长,古代又称短日至或日南至。
///
小寒:冷气积久而为寒,此时尚未冷到顶点。
///
大寒:天候达到最寒冷的程度
///
</remarks>
public
SolarTerm[] GetSolarTerm(
int
year,
int
month)
{
string
[] lunarHoliDayName
=
{
"
小寒
"
,
"
大寒
"
,
"
立春
"
,
"
雨水
"
,
"
惊蛰
"
,
"
春分
"
,
"
清明
"
,
"
谷雨
"
,
"
立夏
"
,
"
小满
"
,
"
芒种
"
,
"
夏至
"
,
"
小暑
"
,
"
大暑
"
,
"
立秋
"
,
"
处暑
"
,
"
白露
"
,
"
秋分
"
,
"
寒露
"
,
"
霜降
"
,
"
立冬
"
,
"
小雪
"
,
"
大雪
"
,
"
冬至
"
};
SolarTerm[] solarTerm
=
new
SolarTerm[
2
];
for
(
int
n
=
month
*
2
-
1
; n
<=
month
*
2
; n
++
)
{
SolarTerm st
=
new
SolarTerm();
double
dd
=
Term(year, n,
true
);
double
sd1
=
AntiDayDifference(
2005
, Math.Floor(dd));
double
sm1
=
Math.Floor(sd1
/
100
);
int
h
=
(
int
)Math.Floor((
double
)Tail(dd)
*
24
);
int
min
=
(
int
)Math.Floor((
double
)(Tail(dd)
*
24
-
h)
*
60
);
int
mmonth
=
(
int
)Math.Ceiling((
double
)n
/
2
);
int
day
=
(
int
)sd1
%
100
;
st.SolarTermDateTime
=
new
DateTime(year, mmonth, day, h, min,
0
);
st.Name
=
lunarHoliDayName[n
-
1
];
solarTerm[n
-
month
*
2
+
1
]
=
st;
}
return
solarTerm;
}
///
<summary>
///
获取指定日期的节气。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
///
<remarks>
我国农历里把节气分得很细,定出了二十四节气,它们的名称大都反应物候、农时或季节的起点与中点。由于节气实际反应太阳运行所引 起的气候变化,故二十四节气为阳历的自然衍生的产物,与阴历无关。二十四节气中以立春、春分、立夏,夏至、立秋、秋分、立冬与冬至等八节气最为重要。它们之间大约相隔46天。一年分为四季,「立」表示四季中每一个季节的开始,而「分」与「至」表示正处于这季节的中间。现代我国所使用的历法,皆依回归年制定,二十四节气基本上是一致的,前后的相差不会超过一两天。为了调合回归年(阳历)与朔望月(阴历)之间的差异,农历把二十四节气中,双数的叫中气,单数的叫节气,而且规定每一个中气标定在一个农历的月份,例如雨水必定在正月,春分必定在二月,谷雨必定在三月,其余依此类推。另外,月名也必须和相对应的中气相合。
</remarks>
public
SolarTerm[] GetSolarTerm(DateTime solarDateTime)
{
return
GetSolarTerm(solarDateTime.Year, solarDateTime.Month);
}
///
<summary>
///
返回星座
///
</summary>
public
string
GetConstellation(DateTime solarDateTime)
{
int
constellation
=
-
1
;
int
Y
=
solarDateTime.Month
*
100
+
solarDateTime.Day;
if
(((Y
>=
321
)
&&
(Y
<=
419
))) { constellation
=
0
; }
else
if
((Y
>=
420
)
&&
(Y
<=
520
)) { constellation
=
1
; }
else
if
((Y
>=
521
)
&&
(Y
<=
620
)) { constellation
=
2
; }
else
if
((Y
>=
621
)
&&
(Y
<=
722
)) { constellation
=
3
; }
else
if
((Y
>=
723
)
&&
(Y
<=
822
)) { constellation
=
4
; }
else
if
((Y
>=
823
)
&&
(Y
<=
922
)) { constellation
=
5
; }
else
if
((Y
>=
923
)
&&
(Y
<=
1022
)) { constellation
=
6
; }
else
if
((Y
>=
1023
)
&&
(Y
<=
1121
)) { constellation
=
7
; }
else
if
((Y
>=
1122
)
&&
(Y
<=
1221
)) { constellation
=
8
; }
else
if
((Y
>=
1222
)
||
(Y
<=
119
)) { constellation
=
9
; }
else
if
((Y
>=
120
)
&&
(Y
<=
218
)) { constellation
=
10
; }
else
if
((Y
>=
219
)
&&
(Y
<=
320
)) { constellation
=
11
; }
string
con
=
"
白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯水瓶双鱼
"
;
return
con.Substring(
2
*
constellation,
2
)
+
"
座
"
;
}
///
<summary>
///
获取儒略日。
///
</summary>
///
<remarks>
zone时区y年m月d日h时min分sec秒距儒略历公元前4713年1月1日格林尼治时间正午12时的天数
</remarks>
public
double
GetJulianDay(DateTime solarDateTime)
{
int
ifG
=
IfGregorian(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day,
1
);
double
jt
=
(solarDateTime.Hour
+
(solarDateTime.Minute
+
solarDateTime.Second
/
60
)
/
60
)
/
24
-
0.5
-
TimeZone.CurrentTimeZone.GetUtcOffset(solarDateTime).Hours
/
24
;
double
jd
=
(ifG
==
1
)
?
(EquivalentStandardDay(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day)
+
1721425
+
jt) : (EquivalentStandardDay(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day)
+
1721425
+
jt);
//
儒略日
return
jd;
}
///
<summary>
///
获取约化儒略日。
///
</summary>
///
<remarks>
为了使用方便,国际上定义当前儒略日减去2400000.5日为约化儒略日(记为MJD)。
</remarks>
public
double
GetMiniJulianDay(DateTime solarDateTime)
{
return
GetJulianDay(solarDateTime)
-
2400000.5
;
}
///
<summary>
///
获取该农历日日食月食情况。
///
</summary>
///
<returns>
Eclipse对象,包含该农历日日食月食情况。
</returns>
public
Eclipse GetEclipse(DateTime solarDateTime,
double
timeZone)
{
Eclipse re
=
new
Eclipse();
double
t
=
(solarDateTime.Year
-
1899.5
)
/
100
;
double
ms
=
Math.Floor((solarDateTime.Year
-
1900
)
*
12.3685
);
double
rpi
=
180
/
Math.PI;
double
zone
=
timeZone;
//
时区
double
f0
=
Angle(ms, t,
0
,
0.75933
,
2.172e-4
,
1.55e-7
)
+
0.53058868
*
ms
-
8.37e-4
*
t
+
zone
/
24
+
0.5
;
double
fc
=
0.1734
-
3.93e-4
*
t;
double
j0
=
693595
+
29
*
ms;
double
aa0
=
Angle(ms, t,
0.08084821133
,
359.2242
/
rpi,
0.0000333
/
rpi,
0.00000347
/
rpi);
double
ab0
=
Angle(ms, t,
7.171366127999999e-2
,
306.0253
/
rpi,
-
0.0107306
/
rpi,
-
0.00001236
/
rpi);
double
ac0
=
Angle(ms, t,
0.08519585128
,
21.2964
/
rpi,
0.0016528
/
rpi,
0.00000239
/
rpi);
//
double leap=0;
//
闰月数,0则不闰
double
lunD
=
-
1
;
//
农历日数
//
double shuoD=0;
//
本阴历月的阴历朔日数
double
shuoT
=
0
;
//
本阴历月的朔时刻
double
wangD
=
0
;
//
本阴历月的望时刻
double
wangT
=
0
;
//
本阴历月的阴历望日数
double
k1
=
0
;
for
(
double
k
=
-
1
; k
<=
13
; k
+=
0.5
)
{
//
k=整数为朔,k=半整数为望
double
aa
=
aa0
+
0.507984293
*
k;
double
ab
=
ab0
+
6.73377553
*
k;
double
ac
=
ac0
+
6.818486628
*
k;
double
f1
=
f0
+
1.53058868
*
k
+
fc
*
Math.Sin(aa)
-
0.4068
*
Math.Sin(ab)
+
0.0021
*
Math.Sin(
2
*
aa)
+
0.0161
*
Math.Sin(
2
*
ab)
+
0.0104
*
Math.Sin(
2
*
ac)
-
0.0074
*
Math.Sin(aa
-
ab)
-
0.0051
*
Math.Sin(aa
+
ab);
double
j
=
j0
+
28
*
k
+
f1;
//
朔或望的等效标准天数及时刻
//
记录当前日期的j值
double
lunD0
=
EquivalentStandardDay(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day)
-
Math.Floor(j);
//
当前日距朔日的差值
if
(k
==
Math.Floor(k)
&&
lunD0
>=
0
&&
lunD0
<=
29
)
{
k1
=
k;
//
记录当前时间对应的k值
shuoT
=
Tail(j);
lunD
=
lunD0
+
1
;
}
if
(k
==
(k1
+
0.5
))
{
wangT
=
Tail(j);
wangD
=
Math.Floor(j)
-
(EquivalentStandardDay(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day)
-
lunD
+
1
)
+
1
;
}
//
判断日月食
re.Phenomena
=
EclipsePhenomena.None;
if
((lunD
==
1
&&
k
==
k1)
||
(lunD
==
wangD
&&
k
==
(k1
+
0.5
)))
{
if
(Math.Abs(Math.Sin(ac))
<=
0.36
)
{
double
s
=
5.19595
-
0.0048
*
Math.Cos(aa)
+
0.002
*
Math.Cos(
2
*
aa)
-
0.3283
*
Math.Cos(ab)
-
0.006
*
Math.Cos(aa
+
ab)
+
0.0041
*
Math.Cos(aa
-
ab);
double
r
=
0.207
*
Math.Sin(aa)
+
0.0024
*
Math.Sin(
2
*
aa)
-
0.039
*
Math.Sin(ab)
+
0.0115
*
Math.Sin(
2
*
ab)
-
0.0073
*
Math.Sin(aa
+
ab)
-
0.0067
*
Math.Sin(aa
-
ab)
+
0.0117
*
Math.Sin(
2
*
ac);
double
p
=
Math.Abs(s
*
Math.Sin(ac)
+
r
*
Math.Cos(ac));
double
q
=
0.0059
+
0.0046
*
Math.Cos(aa)
-
0.0182
*
Math.Cos(ab)
+
0.0004
*
Math.Cos(
2
*
ab)
-
0.0005
*
Math.Cos(aa
+
ab);
if
(p
-
q
<=
1.5572
)
{
re.Phenomena
=
EclipsePhenomena.EclipseOfSun;
//
日食
if
(k
!=
Math.Floor(k))
{
if
(p
+
q
>=
1.0129
)
re.Phenomena
=
EclipsePhenomena.PartialEclipseOfTheMoon;
//
月偏食
else
re.Phenomena
=
EclipsePhenomena.CompleteEclipseOfTheMoon;
//
月全食
}
}
}
}
}
//
k循环结束
re.Syzygy
=
Syzygy.None;
if
(lunD
==
1
)
{
re.Syzygy
=
Syzygy.NewMoon;
int
h
=
(
int
)Math.Floor(shuoT
*
24
);
int
min
=
(
int
)Math.Floor((shuoT
*
24
-
h)
*
60
);
re.DateTime
=
new
DateTime(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day, h, min,
0
);
//
朔日则返回朔的时刻
}
if
(lunD
==
wangD)
{
re.Syzygy
=
Syzygy.FullMoon;
int
h
=
(
int
)Math.Floor(wangT
*
24
);
int
min
=
(
int
)Math.Floor((wangT
*
24
-
h)
*
60
);
re.DateTime
=
new
DateTime(solarDateTime.Year, solarDateTime.Month, solarDateTime.Day, h, min,
0
);
//
望日则返回望的时刻
}
return
re;
}
#endregion
#region
字符串相关
///
<summary>
///
返回甲子数x对应的天干字符串
///
</summary>
public
string
ToStringWithCelestialStem(
int
x)
{
return
"
癸甲乙丙丁戊己庚辛壬
"
.Substring(x
%
10
,
1
);
}
///
<summary>
///
返回甲子数x对应的地支字符串
///
</summary>
public
string
ToStringWithTerrestrialBranch(
int
x)
{
return
"
亥子丑寅卯辰巳午未申酉戌
"
.Substring(x
%
12
,
1
);
}
///
<summary>
///
返回甲子数x对应的干支字符串
///
</summary>
///
<param name="x"></param>
///
<returns></returns>
public
string
ToStringWithSexagenary(
int
x)
{
return
ToStringWithCelestialStem(x)
+
ToStringWithTerrestrialBranch(x);
}
///
<summary>
///
将返回农历日对应的字符串
///
</summary>
///
<param name="v"></param>
///
<returns></returns>
public
string
ToStringWithChineseDay(
int
v)
{
string
str
=
"
十一二三四五六七八九初十廿三
"
;
string
vstr
=
str.Substring((
int
)Math.Floor((
double
)v
/
10
)
+
10
,
1
)
+
str.Substring((
int
)v
%
10
,
1
);
if
(v
==
10
)
vstr
=
"
初十
"
;
return
vstr;
}
///
<summary>
///
获取指定数的纳音五行。
///
</summary>
///
<param name="x"></param>
///
<returns></returns>
///
<remarks>
六十甲子和五音十二律结合起来,其中一律含五音,总数共为六十的“纳音五行”。
</remarks>
public
string
GetNaYinWuXing(
int
x)
{
string
[] s
=
new
string
[]
{
"
海中金
"
,
"
炉中火
"
,
"
大林木
"
,
"
路旁土
"
,
"
剑锋金
"
,
"
山头火
"
,
"
洞下水
"
,
"
城墙土
"
,
"
白腊金
"
,
"
杨柳木
"
,
"
泉中水
"
,
"
屋上土
"
,
"
霹雷火
"
,
"
松柏木
"
,
"
常流水
"
,
"
沙中金
"
,
"
山下火
"
,
"
平地木
"
,
"
壁上土
"
,
"
金箔金
"
,
"
佛灯火
"
,
"
天河水
"
,
"
大驿土
"
,
"
钗钏金
"
,
"
桑松木
"
,
"
大溪水
"
,
"
沙中土
"
,
"
天上火
"
,
"
石榴木
"
,
"
大海水
"
};
return
s[(
int
)Math.Floor((
double
)((x
-
1
)
/
2
))];
}
///
<summary>
///
获取指定时间的月代名词。
///
</summary>
///
<param name="solarDateTime">
要获取的阳历对象
</param>
///
<returns></returns>
///
<remarks>
一年分为春夏秋冬四时,后来又按夏历正月、二月、三月等十二个月分为孟春、仲春、季春、孟夏、仲夏、季夏、孟秋、仲秋、季秋、孟冬、仲冬、季冬。古书常把这些名称作为月份的代名词。
</remarks>
public
string
GetChineseMonthPronoun(DateTime solarDateTime)
{
string
[] s
=
new
string
[] {
"
孟春
"
,
"
仲春
"
,
"
季春
"
,
"
孟夏
"
,
"
仲夏
"
,
"
季夏
"
,
"
孟秋
"
,
"
仲秋
"
,
"
季秋
"
,
"
孟冬
"
,
"
仲冬
"
,
"
季冬
"
};
return
s[netCalendar.GetMonth(solarDateTime)
-
1
];
}
///
<summary>
///
获取指定时间的七十二候。
///
</summary>
///
<remarks>
五天一候,一年365天(平年)为73候,为与24节气对应,规定三候为一节(气)、一年为72候。每一候均以一种物候现象作相应,叫“候应”。72候的“候”应包括非生物和生物两大类,前者如“水始涸”、“东风解冻”、“虹始见”、“地始冻”等;后者有动物和植物,如“鸿雁来”、“虎始交”、“萍始生”、“苦菜秀”、“桃始华”等。七十二候的起源很早,对农事活动曾起过一定作用。虽然其中有些物候描述不那么准确,其中还有不科学成份,但对于了解古代华北地区的气候及其变迁,仍然具有一定的参考价值。由于当时确定物候的始见单位较小而气候的实际及地区差别很大,所以很难广泛应用。现在黄河流域物候现象已发生变化,其他地区的物候更是千差万别,必须不断发展物候学,制定新的自然历,否则一味地机械照搬古书是行不通的。
</remarks>
///
<param name="solarDateTime">
要获取的阳历对象
</param>
///
<returns></returns>
public
string
GetWuHou(DateTime solarDateTime)
{
string
xs1
=
string
.Empty;
SolarTerm[] solar
=
GetSolarTerm(solarDateTime);
int
jq
=
solar[
0
].SolarTermDateTime.Day;
int
zq
=
solar[
1
].SolarTermDateTime.Day;
int
c
=
solarDateTime.Day
+
1
;
int
month
=
solarDateTime.Month
-
1
;
if
(month
==
0
)
{
if
(c
<
jq
-
1
) { xs1
=
"
水泉动
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
雁北乡
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
鹊始巢
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
鳺始鴝
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
鸡始乳
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
征鸟厉疾
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
水泽腹坚
"
; }
}
if
(month
==
1
)
{
if
(c
<
jq
-
1
) { xs1
=
"
水泽腹坚
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
东风解冻
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
蛰虫始振
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
鱼上冰
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
獭祭鱼
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
候雁北
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
草木萌动
"
; }
}
if
(month
==
2
)
{
if
(c
<
jq
-
1
) { xs1
=
"
草木萌动
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
桃始华
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
仓庚鸣
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
鹰化为鸠
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
玄鸟至
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
雷乃发声
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
始电
"
; }
}
if
(month
==
3
)
{
if
(c
<
jq
-
1
) { xs1
=
"
始电
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
桐始华
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
田鼠化为鴽
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
虹始见
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
萍始生
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
鸣鸠拂其羽
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
戴胜降于桑
"
; }
}
if
(month
==
4
)
{
if
(c
<
jq
-
1
) { xs1
=
"
戴胜降于桑
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
蝼蝈鸣
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
蚯蚓出
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
王瓜生
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
苦菜秀
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
靡草死
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
麦秋至
"
; }
}
if
(month
==
5
)
{
if
(c
<
jq
-
1
) { xs1
=
"
麦秋至
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
螳螂生
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
鵙始鸣
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
反舌无声
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
鹿角解
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
蜩始鸣
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
半夏生
"
; }
}
if
(month
==
6
)
{
if
(c
<
jq
-
1
) { xs1
=
"
半夏生
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
温风至
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
蟀蟋居壁
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
鹰如鸷
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
腐草为萤
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
土润溽暑
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
大雨时行
"
; }
}
if
(month
==
7
)
{
if
(c
<
jq
-
1
) { xs1
=
"
大雨时行
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
凉风至
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
白露降
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
寒蝉鸣
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
鹰乃祭鸟
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
天地始肃
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
禾乃登
"
; }
}
if
(month
==
8
)
{
if
(c
<
jq
-
1
) { xs1
=
"
禾乃登
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
鸿雁来
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
玄鸟归
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
群鸟养羞
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
雷乃收声
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
蛰虫坯户
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
水始涸
"
; }
}
if
(month
==
9
)
{
if
(c
<
jq
-
1
) { xs1
=
"
水始涸
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
鸿雁来宾
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
雀入大水为蛤
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
菊有黄花
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
豺乃祭兽
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
草木黄落
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
蛰虫咸俯
"
; }
}
if
(month
==
10
)
{
if
(c
<
jq
-
1
) { xs1
=
"
蛰虫咸俯
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
水始冰
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
地始冻
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
雉入大水为蜃
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
虹藏不见
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
天气腾地气降
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
闭塞成冬
"
; }
}
if
(month
==
11
)
{
if
(c
<
jq
-
1
) { xs1
=
"
闭塞成冬
"
; }
else
if
(c
>=
jq
-
1
&&
c
<=
jq
+
3
) { xs1
=
"
鹖鴠不鸣
"
; }
else
if
(c
>
jq
+
3
&&
c
<=
jq
+
8
) { xs1
=
"
虎始交
"
; }
else
if
(c
>
jq
+
8
&&
c
<
zq
-
1
) { xs1
=
"
荔挺出
"
; }
else
if
(c
>=
zq
-
1
&&
c
<=
zq
+
3
) { xs1
=
"
蚯蚓结
"
; }
else
if
(c
>
zq
+
3
&&
c
<=
zq
+
8
) { xs1
=
"
麋鹿解
"
; }
else
if
(c
>
zq
+
8
) { xs1
=
"
水泉动
"
; }
}
return
xs1;
}
///
<summary>
///
获取当日月相名。
///
</summary>
///
<param name="solarDateTime">
要获取的阳历对象
</param>
///
<returns></returns>
public
string
GetMoonName(DateTime solarDateTime)
{
string
mnname
=
string
.Empty;
int
month
=
netCalendar.GetDayOfMonth(solarDateTime);
if
(month
>=
24
) mnname
=
"
有明月
"
;
if
(month
<=
14
) mnname
=
"
宵月
"
;
if
(month
<=
7
) mnname
=
"
夕月
"
;
if
(month
==
1
) mnname
=
"
新(朔)月
"
;
if
(month
==
2
) mnname
=
"
既朔月
"
;
if
(month
==
3
) mnname
=
"
娥眉新月
"
;
if
(month
==
4
) mnname
=
"
娥眉新月
"
;
if
(month
==
5
) mnname
=
"
娥眉月
"
;
if
(month
==
7
) mnname
=
"
上弦月
"
;
if
(month
==
8
) mnname
=
"
上弦月
"
;
if
(month
==
9
) mnname
=
"
九夜月
"
;
if
(month
==
13
) mnname
=
"
渐盈凸月
"
;
if
(month
==
14
) mnname
=
"
小望月
"
;
if
(month
==
15
) mnname
=
"
满(望)月
"
;
if
(month
==
16
) mnname
=
"
既望月
"
;
if
(month
==
17
) mnname
=
"
立待月
"
;
if
(month
==
18
) mnname
=
"
居待月
"
;
if
(month
==
19
) mnname
=
"
寝待月
"
;
if
(month
==
20
) mnname
=
"
更待月
"
;
if
(month
==
21
) mnname
=
"
渐亏凸月
"
;
if
(month
==
22
) mnname
=
"
下弦月
"
;
if
(month
==
23
) mnname
=
"
下弦月
"
;
if
(month
==
26
) mnname
=
"
娥眉残月
"
;
if
(month
==
27
) mnname
=
"
娥眉残月
"
;
if
(month
==
28
) mnname
=
"
残月
"
;
if
(month
==
29
) mnname
=
"
晓月
"
;
if
(month
==
30
) mnname
=
"
晦月
"
;
return
mnname;
}
///
<summary>
///
获取指定时间的日禄。
///
</summary>
///
<param name="solarDateTime">
要获取的阳历对象
</param>
///
<returns></returns>
public
string
GetRiLu(DateTime solarDateTime)
{
string
dayglk
=
"
寅卯巳午巳午申酉亥子
"
;
int
bsg
=
Zhi(LD(solarDateTime));
int
bs
=
Gan(LD(solarDateTime));
string
dayglus
=
string
.Empty;
if
(bsg
==
0
) { dayglus
=
ToStringWithCelestialStem(
10
)
+
"
命进禄
"
; }
else
if
(bsg
==
2
) { dayglus
=
ToStringWithCelestialStem(
1
)
+
"
命进禄
"
; }
else
if
(bsg
==
3
) { dayglus
=
ToStringWithCelestialStem(
2
)
+
"
命进禄
"
; }
else
if
(bsg
==
5
) { dayglus
=
ToStringWithCelestialStem(
3
)
+
"
,
"
+
ToStringWithCelestialStem(
5
)
+
"
命进禄
"
; }
else
if
(bsg
==
6
) { dayglus
=
ToStringWithCelestialStem(
4
)
+
"
,
"
+
ToStringWithCelestialStem(
6
)
+
"
命进禄
"
; }
else
if
(bsg
==
8
) { dayglus
=
ToStringWithCelestialStem(
7
)
+
"
命进禄
"
; }
else
if
(bsg
==
9
) { dayglus
=
ToStringWithCelestialStem(
8
)
+
"
命进禄
"
; }
else
if
(bsg
==
11
) { dayglus
=
ToStringWithCelestialStem(
9
)
+
"
命进禄
"
; }
else
{ dayglus
=
""
; }
return
dayglk.Substring(bs,
1
)
+
"
命互禄
"
+
dayglus;
}
///
<summary>
///
获取吉神方位。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
public
string
GetLuckyDeity(DateTime solarDateTime)
{
int
bs
=
Gan(LD(solarDateTime));
string
xs
=
string
.Empty, fs
=
string
.Empty, cs
=
string
.Empty;
if
(bs
==
0
||
bs
==
5
) { xs
=
"
喜神:东北
"
; }
else
if
(bs
==
1
||
bs
==
6
) { xs
=
"
喜神:西北
"
; }
else
if
(bs
==
2
||
bs
==
7
) { xs
=
"
喜神:西南
"
; }
else
if
(bs
==
3
||
bs
==
8
) { xs
=
"
喜神:正南
"
; }
else
if
(bs
==
4
||
bs
==
9
) { xs
=
"
喜神:东南
"
; }
if
(bs
==
0
||
bs
==
1
) { fs
=
"
福神:东南
"
; }
else
if
(bs
==
2
||
bs
==
3
) { fs
=
"
福神:正东
"
; }
else
if
(bs
==
4
) { fs
=
"
福神:正北
"
; }
else
if
(bs
==
5
) { fs
=
"
福神:正南
"
; }
else
if
(bs
==
6
||
bs
==
7
) { fs
=
"
福神:西南
"
; }
else
if
(bs
==
8
) { fs
=
"
福神:西北
"
; }
else
if
(bs
==
9
) { fs
=
"
福神:正西
"
; }
if
(bs
==
0
||
bs
==
1
) { cs
=
"
财神:东北
"
; }
else
if
(bs
==
2
||
bs
==
3
) { cs
=
"
财神:西南
"
; }
else
if
(bs
==
4
||
bs
==
5
) { cs
=
"
财神:正北
"
; }
else
if
(bs
==
6
||
bs
==
7
) { cs
=
"
财神:正东
"
; }
else
if
(bs
==
8
||
bs
==
9
) { cs
=
"
财神:正南
"
; }
return
xs
+
fs
+
cs;
}
///
<summary>
///
获取彭祖百忌。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
///
<remarks>
每日时辰应忌讳之事
</remarks>
public
string
GetPengZuBaiJi(DateTime solarDateTime)
{
string
[] g
=
new
string
[] {
"
甲不开仓
"
,
"
乙不栽植
"
,
"
丙不修灶
"
,
"
丁不剃头
"
,
"
戊不受田
"
,
"
己不破券
"
,
"
庚不经络
"
,
"
辛不合酱
"
,
"
壬不泱水
"
,
"
癸不词讼
"
};
string
[] z
=
new
string
[] {
"
子不问卜
"
,
"
丑不冠带
"
,
"
寅不祭祀
"
,
"
卯不穿井
"
,
"
辰不哭泣
"
,
"
巳不远行
"
,
"
午不苫盖
"
,
"
未不服药
"
,
"
申不安床
"
,
"
酉不会客
"
,
"
戌不吃犬
"
,
"
亥不嫁娶
"
};
int
ceod
=
GetChineseEraOfDay(solarDateTime)
-
1
;
return
g[ceod
%
10
]
+
z[ceod
%
12
];
}
///
<summary>
///
获取相冲。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
///
<remarks>
“冲”即地支相冲,即子午相冲、丑未相冲、寅申相冲、卯酉相冲、辰戌相冲、巳亥相冲,再把十二地支配以十二属相,子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪。于是,凡子日,与午相冲,即为“冲马”;寅日,与申相冲,即为“冲猴”。黄历设立此款,是告诉人们,不要选用那些与自己属相相冲的日子。
</remarks>
public
string
GetXiangChong(DateTime solarDateTime)
{
string
[] gan
=
new
string
[] {
"
戊
"
,
"
己
"
,
"
庚
"
,
"
辛
"
,
"
壬
"
,
"
癸
"
,
"
甲
"
,
"
乙
"
,
"
丙
"
,
"
丁
"
};
string
[] zhi
=
new
string
[] {
"
午
"
,
"
未
"
,
"
申
"
,
"
酉
"
,
"
戌
"
,
"
亥
"
,
"
子
"
,
"
丑
"
,
"
寅
"
,
"
卯
"
,
"
辰
"
,
"
巳
"
};
string
[] animal
=
new
string
[] {
"
鼠
"
,
"
牛
"
,
"
虎
"
,
"
兔
"
,
"
龙
"
,
"
蛇
"
,
"
马
"
,
"
羊
"
,
"
猴
"
,
"
鸡
"
,
"
狗
"
,
"
猪
"
};
string
[] animal2
=
new
string
[] {
"
马
"
,
"
羊
"
,
"
猴
"
,
"
鸡
"
,
"
狗
"
,
"
猪
"
,
"
鼠
"
,
"
牛
"
,
"
虎
"
,
"
兔
"
,
"
龙
"
,
"
蛇
"
};
int
dd
=
Zhi(LD(solarDateTime));
int
d
=
Gan(LD(solarDateTime));
return
animal[dd]
+
"
日冲(
"
+
gan[d]
+
zhi[dd]
+
"
)
"
+
animal2[dd];
}
///
<summary>
///
获取岁煞。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
///
<remarks>
岁煞,常居四季,成为“四季之阴气”,极其狠毒,能游行天上,所理之地不可穿凿、修营和移徙。不慎而冲犯这,家中子孙六畜将受伤害。然岁煞巡行的方位却极易寻觅。子日起正南,向东逆行,一日一位,四日一周,循环往复。
</remarks>
public
string
GetSuiSha(DateTime solarDateTime)
{
string
[] sfw
=
new
string
[] {
"
南
"
,
"
东
"
,
"
北
"
,
"
西
"
,
"
南
"
,
"
东
"
,
"
北
"
,
"
西
"
,
"
南
"
,
"
东
"
,
"
北
"
,
"
西
"
};
int
dd
=
Zhi(LD(solarDateTime));
return
"
岁煞
"
+
sfw[dd];
}
///
<summary>
///
获取指定甲子数所对应的五行。
///
</summary>
///
<param name="x"></param>
///
<returns></returns>
public
string
GetWuXing(
int
x)
{
string
nyy
=
string
.Empty;
string
d
=
Gan(x).ToString()
+
Zhi(x).ToString();
if
(d
==
"
00
"
||
d
==
"
11
"
) nyy
=
"
金
"
;
if
(d
==
"
22
"
||
d
==
"
33
"
) nyy
=
"
火
"
;
if
(d
==
"
44
"
||
d
==
"
55
"
) nyy
=
"
木
"
;
if
(d
==
"
66
"
||
d
==
"
77
"
) nyy
=
"
土
"
;
if
(d
==
"
88
"
||
d
==
"
99
"
) nyy
=
"
金
"
;
if
(d
==
"
010
"
||
d
==
"
111
"
) nyy
=
"
火
"
;
if
(d
==
"
20
"
||
d
==
"
31
"
) nyy
=
"
水
"
;
if
(d
==
"
42
"
||
d
==
"
53
"
) nyy
=
"
土
"
;
if
(d
==
"
64
"
||
d
==
"
75
"
) nyy
=
"
金
"
;
if
(d
==
"
86
"
||
d
==
"
97
"
) nyy
=
"
木
"
;
if
(d
==
"
08
"
||
d
==
"
19
"
) nyy
=
"
水
"
;
if
(d
==
"
210
"
||
d
==
"
311
"
) nyy
=
"
土
"
;
if
(d
==
"
40
"
||
d
==
"
51
"
) nyy
=
"
火
"
;
if
(d
==
"
62
"
||
d
==
"
73
"
) nyy
=
"
木
"
;
if
(d
==
"
84
"
||
d
==
"
95
"
) nyy
=
"
水
"
;
if
(d
==
"
06
"
||
d
==
"
17
"
) nyy
=
"
金
"
;
if
(d
==
"
28
"
||
d
==
"
39
"
) nyy
=
"
火
"
;
if
(d
==
"
410
"
||
d
==
"
511
"
) nyy
=
"
木
"
;
if
(d
==
"
60
"
||
d
==
"
71
"
) nyy
=
"
土
"
;
if
(d
==
"
82
"
||
d
==
"
93
"
) nyy
=
"
金
"
;
if
(d
==
"
04
"
||
d
==
"
15
"
) nyy
=
"
火
"
;
if
(d
==
"
26
"
||
d
==
"
37
"
) nyy
=
"
水
"
;
if
(d
==
"
48
"
||
d
==
"
59
"
) nyy
=
"
土
"
;
if
(d
==
"
610
"
||
d
==
"
711
"
) nyy
=
"
金
"
;
if
(d
==
"
80
"
||
d
==
"
91
"
) nyy
=
"
木
"
;
if
(d
==
"
02
"
||
d
==
"
13
"
) nyy
=
"
水
"
;
if
(d
==
"
24
"
||
d
==
"
35
"
) nyy
=
"
土
"
;
if
(d
==
"
46
"
||
d
==
"
57
"
) nyy
=
"
火
"
;
if
(d
==
"
68
"
||
d
==
"
79
"
) nyy
=
"
木
"
;
if
(d
==
"
810
"
||
d
==
"
911
"
) nyy
=
"
水
"
;
return
nyy;
}
///
<summary>
///
获取星宿。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
public
string
GetXingXiu(DateTime solarDateTime)
{
string
[] Sukuyou
=
new
string
[] {
"
东方角木蛟-吉
"
,
"
东方亢金龙-凶
"
,
"
东方氐土貉-凶
"
,
"
东方房日兔-吉
"
,
"
东方心月狐-凶
"
,
"
东方尾火虎-吉
"
,
"
东方箕水豹-吉
"
,
"
北方斗木獬-吉
"
,
"
北方牛金牛-凶
"
,
"
北方女土蝠-凶
"
,
"
北方虚日鼠-凶
"
,
"
北方危月燕-凶
"
,
"
北方室火猪-吉
"
,
"
北方壁水貐-吉
"
,
"
西方奎木狼-凶
"
,
"
西方娄金狗-吉
"
,
"
西方胃土雉-吉
"
,
"
西方昴日鸡-凶
"
,
"
西方毕月乌-吉
"
,
"
西方觜火猴-凶
"
,
"
西方参水猿-凶
"
,
"
南方井木犴-吉
"
,
"
南方鬼金羊-凶
"
,
"
南方柳土獐-凶
"
,
"
南方星日马-凶
"
,
"
南方张月鹿-吉
"
,
"
南方翼火蛇-凶
"
,
"
南方轸水蚓-吉
"
};
int
s
=
(
int
)(GetJulianDay(solarDateTime)
+
12
)
%
28
;
return
Sukuyou[s];
}
///
<summary>
///
获取六耀。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
public
string
GetLiuYao(DateTime solarDateTime)
{
string
[] Rokuyou
=
new
string
[] {
"
先胜
"
,
"
友引
"
,
"
先负
"
,
"
佛灭
"
,
"
大安
"
,
"
赤口
"
};
int
k
=
(solarDateTime.Month
+
solarDateTime.Day
+
4
)
%
6
;
return
Rokuyou[k];
}
///
<summary>
///
获取12建星。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
public
string
Get12JianXing(DateTime solarDateTime)
{
string
[] jcName0
=
new
string
[] {
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
};
string
[] jcName1
=
new
string
[] {
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
};
string
[] jcName2
=
new
string
[] {
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
};
string
[] jcName3
=
new
string
[] {
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
};
string
[] jcName4
=
new
string
[] {
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
};
string
[] jcName5
=
new
string
[] {
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
};
string
[] jcName6
=
new
string
[] {
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
};
string
[] jcName7
=
new
string
[] {
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
};
string
[] jcName8
=
new
string
[] {
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
,
"
平
"
};
string
[] jcName9
=
new
string
[] {
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
,
"
满
"
};
string
[] jcName10
=
new
string
[] {
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
,
"
除
"
};
string
[] jcName11
=
new
string
[] {
"
除
"
,
"
满
"
,
"
平
"
,
"
定
"
,
"
执
"
,
"
破
"
,
"
危
"
,
"
成
"
,
"
收
"
,
"
开
"
,
"
闭
"
,
"
建
"
};
int
num
=
Zhi(LM(solarDateTime));
int
num2
=
Zhi(LD(solarDateTime));
if
(num
==
0
)
return
(jcName0[num2]);
if
(num
==
1
)
return
(jcName1[num2]);
if
(num
==
2
)
return
(jcName2[num2]);
if
(num
==
3
)
return
(jcName3[num2]);
if
(num
==
4
)
return
(jcName4[num2]);
if
(num
==
5
)
return
(jcName5[num2]);
if
(num
==
6
)
return
(jcName6[num2]);
if
(num
==
7
)
return
(jcName7[num2]);
if
(num
==
8
)
return
(jcName8[num2]);
if
(num
==
9
)
return
(jcName9[num2]);
if
(num
==
10
)
return
(jcName10[num2]);
if
(num
==
11
)
return
(jcName11[num2]);
return
""
;
}
///
<summary>
///
获取值日星神
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
public
string
GetXingShen(DateTime solarDateTime)
{
string
[] zrxName1
=
new
string
[] {
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
};
string
[] zrxName2
=
new
string
[] {
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
};
string
[] zrxName3
=
new
string
[] {
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
};
string
[] zrxName4
=
new
string
[] {
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
};
string
[] zrxName5
=
new
string
[] {
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
};
string
[] zrxName6
=
new
string
[] {
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
};
string
[] zrxName7
=
new
string
[] {
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
};
string
[] zrxName8
=
new
string
[] {
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
};
string
[] zrxName9
=
new
string
[] {
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
};
string
[] zrxName10
=
new
string
[] {
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
};
string
[] zrxName11
=
new
string
[] {
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
,
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
};
string
[] zrxName12
=
new
string
[] {
"
天刑(黑道日)
"
,
"
朱雀(黑道日)
"
,
"
金匮(黄道日)
"
,
"
天德(黄道日)
"
,
"
白虎(黑道日)
"
,
"
玉堂(黄道日)
"
,
"
天牢(黑道日)
"
,
"
玄武(黑道日)
"
,
"
司命(黄道日)
"
,
"
勾陈(黑道日)
"
,
"
青龙(黄道日)
"
,
"
明堂(黄道日)
"
};
int
num
=
Zhi(LM(solarDateTime));
int
num2
=
Zhi(LD(solarDateTime));
if
(num
==
2
)
return
(zrxName1[num2]);
if
(num
==
3
)
return
(zrxName2[num2]);
if
(num
==
4
)
return
(zrxName3[num2]);
if
(num
==
5
)
return
(zrxName4[num2]);
if
(num
==
6
)
return
(zrxName5[num2]);
if
(num
==
7
)
return
(zrxName6[num2]);
if
(num
==
8
)
return
(zrxName7[num2]);
if
(num
==
9
)
return
(zrxName8[num2]);
if
(num
==
10
)
return
(zrxName9[num2]);
if
(num
==
11
)
return
(zrxName10[num2]);
if
(num
==
0
)
return
(zrxName11[num2]);
if
(num
==
1
)
return
(zrxName12[num2]);
return
""
;
}
///
<summary>
///
获取九星。
///
</summary>
///
<param name="solarDateTime"></param>
///
<returns></returns>
public
string
GetJiuXing(DateTime solarDateTime)
{
string
[] KyuuseiName
=
new
string
[] {
"
一白-太乙星(水)-吉神
"
,
"
二黒-摄提星(土)-凶神
"
,
"
三碧-轩辕星(木)-安神
"
,
"
四緑-招摇星(木)-安神
"
,
"
五黄-天符星(土)-凶神
"
,
"
六白-青龙星(金)-吉神
"
,
"
七赤-咸池星(金)-凶神
"
,
"
八白-太阴星(土)-吉神
"
,
"
九紫-天乙星(火)-吉神
"
};
return
KyuuseiName[Jd2Kyuusei(GetJulianDay(solarDateTime))];
}
///
<summary>
///
获取几牛耕田。
///
</summary>
///
<param name="year"></param>
///
<returns></returns>
///
<remarks>
每年第一个丑日(丑为牛)在正月初几,就是“几牛耕田”。耕田的牛是多多益善,越多越好
</remarks>
public
string
GetNiuGenTian(
int
year)
{
int
i
=
Zhi(GetChineseEraOfDay(
new
DateTime(year,
1
,
1
, netCalendar)));
int
t
=
(
15
-
i)
%
12
;
string
s
=
ToStringWithChineseDay(t);
if
(t
<=
10
)
{
s
=
s.Substring(
1
);
}
return
s
+
"
牛耕田
"
;
}
///
<summary>
///
获取几龙治水。
///
</summary>
///
<param name="year"></param>
///
<returns></returns>
///
<remarks>
是根据每年正月第一个辰日(辰为龙)在第几日决定的。如在正月初五,就叫“五龙治水”,在初六,就叫“六龙治水”,等等。据说,龙数越多,雨量越少,龙数越少,雨量就越多。民间自古就有“龙多不下雨”的谚语。
</remarks>
public
string
GetLongZhiSui(
int
year)
{
int
i
=
Zhi(GetChineseEraOfDay(
new
DateTime(year,
1
,
1
, netCalendar)));
int
t
=
(
18
-
i)
%
12
;
string
s
=
ToStringWithChineseDay(t);
if
(t
<=
10
)
{
s
=
s.Substring(
1
);
}
return
s
+
"
龙治水
"
;
}
#endregion
#region
计算
private
int
LD(DateTime solarDateTime)
{
double
dayCyclical
=
Microsoft.JScript.DateConstructor.UTC(solarDateTime.Year, solarDateTime.Month
-
1
,
1
,
0
,
0
,
0
,
0
)
/
86400000
+
25567
+
9
;
return
(
int
)(dayCyclical
+
solarDateTime.Day);
}
private
int
LM(DateTime solarDateTime)
{
int
num
=
(solarDateTime.Year
-
1900
)
*
12
+
solarDateTime.Month
+
11
;
if
((solarDateTime.Day
+
1
)
>=
GetSolarTerm(solarDateTime)[
0
].SolarTermDateTime.Day)
{
num
+=
1
;
}
return
num;
}
int
[] NKyuusei
=
new
int
[] {
-
1
,
-
1
,
-
1
};
private
int
Jd2Kyuusei(
double
JD)
{
int
flag, b;
int
jD
=
(
int
)Math.Floor(JD);
if
((jD
<
NKyuusei[
0
])
||
(jD
>=
NKyuusei[
0
]
+
NKyuusei[
1
]))
{
if
(GetTenton(jD)
<
0
)
return
-
1
;
}
if
(NKyuusei[
2
]
<
0
)
{
flag
=
-
1
;
}
else
{
flag
=
1
;
}
b
=
flag
*
NKyuusei[
2
]
-
1
+
270
;
b
+=
(jD
-
NKyuusei[
0
])
*
flag;
return
b
%
9
;
}
private
int
GetTenton(
int
JD)
{
int
[] KyuuseiJD
=
new
int
[] {
2404030
,
2404600
,
2404810
,
2408800
,
2409010
,
2413000
,
2413210
,
2417200
,
2417410
,
2421220
,
2421400
,
2421610
,
2425420
,
2425630
,
2429620
,
2429800
,
2430010
,
2433820
,
2434030
,
2438020
,
2438230
,
2442220
,
2442430
,
2446420
,
2446630
,
2450620
,
2450830
,
2454820
,
2455030
,
2458840
,
2459020
,
2459230
,
2463250
,
2467240
,
2467420
,
2467630
,
2471440
,
2471650
,
2475640
,
2475850
,
2477650
};
int
[] KyuuseiJDF
=
new
int
[] {
1
,
-
3
,
1
,
7
,
-
9
,
-
3
,
1
,
7
,
-
9
,
7
,
-
3
,
1
,
-
3
,
1
,
7
,
-
3
,
1
,
-
3
,
1
,
7
,
-
9
,
-
3
,
1
,
7
,
-
9
,
-
3
,
1
,
7
,
-
9
,
7
,
-
3
,
1
,
1
,
7
,
-
3
,
1
,
-
3
,
1
,
7
,
-
9
,
-
9
};
int
KJD
=
0
, KJDF
=
0
, n
=
0
;
int
ne
=
KyuuseiJD.Length;
if
(JD
<
KyuuseiJD[
0
])
return
-
1
;
if
(JD
>=
KyuuseiJD[ne
-
1
])
return
-
1
;
for
(n
=
1
; n
<
ne; n
++
)
{
if
(JD
<
KyuuseiJD[n])
{
KJD
=
KyuuseiJD[n
-
1
];
KJDF
=
KyuuseiJDF[n
-
1
];
ne
=
KyuuseiJD[n];
break
;
}
}
do
{
NKyuusei[
0
]
=
KJD;
KJD
+=
180
;
if
(KJD
+
61
>
ne) { KJD
=
ne; }
if
(JD
>=
KJD)
{
KJDF
=
(KJDF
<
0
)
?
1
:
-
9
;
}
}
while
(JD
>=
KJD);
NKyuusei[
1
]
=
KJD
-
NKyuusei[
0
];
NKyuusei[
2
]
=
KJDF;
return
NKyuusei[
0
];
}
///
<summary>
///
判断y年m月(1,2,..,12,下同)d日是Gregorian历还是Julian历(opt=1,2,3分别表示标准日历,Gregorge历和Julian历),是则返回1,是Julian历则返回0,若是Gregorge历所删去的那10天则返回-1
///
</summary>
private
int
IfGregorian(
int
y,
int
m,
int
d,
int
opt)
{
if
(opt
==
1
)
{
if
(y
>
1582
||
(y
==
1582
&&
m
>
10
)
||
(y
==
1582
&&
m
==
10
&&
d
>
14
))
return
(
1
);
//
Gregorian
else
if
(y
==
1582
&&
m
==
10
&&
d
>=
5
&&
d
<=
14
)
return
(
-
1
);
//
空
else
return
(
0
);
//
Julian
}
if
(opt
==
2
)
return
(
1
);
//
Gregorian
if
(opt
==
3
)
return
(
0
);
//
Julian
return
(
-
1
);
}
///
<summary>
///
返回等效标准天数(y年m月d日相应历种的1年1月1日的等效(即对Gregorian历与Julian历是统一的)天数)
///
</summary>
private
double
EquivalentStandardDay(
int
y,
int
m,
int
d)
{
double
v
=
(y
-
1
)
*
365
+
Math.Floor((
double
)((y
-
1
)
/
4
))
+
DayDifference(y, m, d)
-
2
;
//
Julian的等效标准天数
if
(y
>
1582
)
v
+=
-
Math.Floor((
double
)((y
-
1
)
/
100
))
+
Math.Floor((
double
)((y
-
1
)
/
400
))
+
2
;
//
Gregorian的等效标准天数
return
v;
}
///
<summary>
///
返回阳历y年m月d日的日差天数(在y年年内所走过的天数,如2000年3月1日为61)
///
</summary>
private
int
DayDifference(
int
y,
int
m,
int
d)
{
int
ifG
=
IfGregorian(y, m, d,
1
);
int
[] monL
=
{
0
,
31
,
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
};
if
(ifG
==
1
)
if
((y
%
100
!=
0
&&
y
%
4
==
0
)
||
(y
%
400
==
0
))
monL[
2
]
+=
1
;
else
if
(y
%
4
==
0
)
monL[
2
]
+=
1
;
int
v
=
0
;
for
(
int
i
=
0
; i
<=
m
-
1
; i
++
)
{
v
+=
monL[i];
}
v
+=
d;
if
(y
==
1582
)
{
if
(ifG
==
1
)
v
-=
10
;
if
(ifG
==
-
1
)
v
=
0
;
//
infinity
}
return
v;
}
//
原始:S
///
<summary>
///
返回y年第n个节气(如小寒为1)的日差天数值(pd取值真假,分别表示平气和定气)
///
</summary>
private
double
Term(
int
y,
int
n,
bool
pd)
{
double
juD
=
y
*
(
365.2423112
-
6.4e-14
*
(y
-
100
)
*
(y
-
100
)
-
3.047e-8
*
(y
-
100
))
+
15.218427
*
n
+
1721050.71301
;
//
儒略日
double
tht
=
3e
-
4
*
y
-
0.372781384
-
0.2617913325
*
n;
//
角度
double
yrD
=
(
1.945
*
Math.Sin(tht)
-
0.01206
*
Math.Sin(
2
*
tht))
*
(
1.048994
-
2.583e-5
*
y);
//
年差实均数
double
shuoD
=
-
18e
-
4
*
Math.Sin(
2.313908653
*
y
-
0.439822951
-
3.0443
*
n);
//
朔差实均数
double
vs
=
(pd)
?
(juD
+
yrD
+
shuoD
-
EquivalentStandardDay(y,
1
,
0
)
-
1721425
) : (juD
-
EquivalentStandardDay(y,
1
,
0
)
-
1721425
);
return
vs;
}
///
<summary>
///
返回阳历y年日差天数为x时所对应的月日数(如y=2000,x=274时,返回1001(表示10月1日,即返回100*m+d))
///
</summary>
private
double
AntiDayDifference(
int
y,
double
x)
{
int
m
=
1
;
for
(
int
j
=
1
; j
<=
12
; j
++
)
{
int
mL
=
DayDifference(y, j
+
1
,
1
)
-
DayDifference(y, j,
1
);
if
(x
<=
mL
||
j
==
12
)
{
m
=
j;
break
;
}
else
x
-=
mL;
}
return
100
*
m
+
x;
}
//
原始:tail
///
<summary>
///
返回x的小数尾数,若x为负值,则是1-小数尾数
///
</summary>
private
double
Tail(
double
x)
{
return
x
-
Math.Floor(x);
}
//
原始:ang
///
<summary>
///
角度函数
///
</summary>
private
double
Angle(
double
x,
double
t,
double
c1,
double
t0,
double
t2,
double
t3)
{
return
Tail(c1
*
x)
*
2
*
Math.PI
+
t0
-
t2
*
t
*
t
-
t3
*
t
*
t
*
t;
}
///
<summary>
///
广义求余
///
</summary>
private
double
rem(
double
x,
double
w)
{
return
Tail((x
/
w))
*
w;
}
///
<summary>
///
返回甲子数x对应的天干数(如33为3)
///
</summary>
private
int
Gan(
int
x)
{
return
x
%
10
;
}
///
<summary>
///
返回甲子数x对应的地支数(如33为9)
///
</summary>
private
int
Zhi(
int
x)
{
return
x
%
12
;
}
#endregion
#region
节日纪念日
///
<summary>
///
获取公历节日字符串。
///
</summary>
public
string
GetHoliday(DateTime solarDateTime)
{
string
re
=
""
;
foreach
(
string
s
in
holiday)
{
if
(solarDateTime.Month
==
Convert.ToInt32(s.Substring(
0
,
2
)))
{
if
(solarDateTime.Day
==
Convert.ToInt32(s.Substring(
2
,
2
)))
{
re
=
s.Substring(
4
);
break
;
}
}
}
return
re;
}
///
<summary>
///
获取名人纪念日字符串。
///
</summary>
public
string
GetCommemoration(DateTime solarDateTime)
{
string
re
=
""
;
foreach
(
string
s
in
celebrity)
{
if
(solarDateTime.Month
==
Convert.ToInt32(s.Substring(
0
,
2
)))
{
if
(solarDateTime.Day
==
Convert.ToInt32(s.Substring(
2
,
2
)))
{
re
=
s.Substring(
4
);
break
;
}
}
}
return
re;
}
///
<summary>
///
获取中国农历节日字符串。
///
</summary>
public
string
GetChineseHoliday(DateTime solarDateTime)
{
string
re
=
""
;
int
mon
=
netCalendar.GetMonth(solarDateTime);
if
(mon
>=
netCalendar.GetLeapMonth(solarDateTime.Year))
mon
-=
1
;
foreach
(
string
s
in
chineseHoliday)
{
if
(mon
==
Convert.ToInt32(s.Substring(
0
,
2
)))
{
if
(netCalendar.GetDayOfMonth(solarDateTime)
==
Convert.ToInt32(s.Substring(
2
,
2
)))
{
re
=
s.Substring(
4
);
break
;
}
}
}
//
梅雨
int
y
=
solarDateTime.Year;
int
thisD0
=
GetDayOfYear(solarDateTime);
int
dG
=
Gan(GetChineseEraOfDay(solarDateTime));
int
dZ
=
Zhi(GetChineseEraOfDay(solarDateTime));
int
s11
=
(
int
)Math.Floor(Term(y,
11
,
true
));
if
(thisD0
>=
s11
&&
thisD0
<
s11
+
10
&&
dG
==
3
)
re
+=
"
入梅
"
;
int
s13
=
(
int
)Math.Floor(Term(y,
13
,
true
));
if
(thisD0
>=
s13
&&
thisD0
<
s13
+
12
&&
dZ
==
8
)
re
+=
"
出梅
"
;
//
"三伏"是指初伏、中伏和末伏,约在7月中旬到8月中旬这一段时间。夏至以后,虽然白天渐短,黑夜渐长,但是一天当中,白天还比黑夜长,每天地面吸收的热量仍比散发的多,近地面的温度也就一天比一天高。到"三伏"期间,地面吸收的热量几乎少于散发的热量,天气也就最热了。再往后,地面吸收的热量开始少于地面散发的热量,温度也就慢慢下降了。所以一年中最热的时候一般出现在夏至的"三伏"。
//
从夏至后第三个“庚”日算起,初伏(10天)、中伏(10~20天)、末伏(立秋后的第一个庚日算起,10天),是一年中天气最热的时间。
//
夏九九歌谣
//
“冬至”数九过冬寒,有的地方也有“夏至”数九过酷暑的歌谣。
//
“夏九九歌”:夏至入头九,羽扇握在手;二九一十八,脱冠着罗纱;三九二十七,出门汗欲滴;四九三十六,浑身汗湿透;五九四十五,炎秋似老虎;六九五十四,乘凉进庙祠;七九六十三,床头摸被单;八九七十二,半夜寻被子;九九八十一,开柜拿棉衣
//
三伏
int
s12
=
(
int
)Math.Floor(Term(y,
12
,
true
));
int
s15
=
(
int
)Math.Floor(Term(y,
15
,
true
));
int
n
=
(dG
-
7
)
%
10
+
1
;
if
(n
<=
0
)
n
+=
10
;
int
firsrD0
=
thisD0
-
n
+
1
;
if
(firsrD0
>=
s12
+
20
&&
firsrD0
<
s12
+
30
)
re
+=
"
初伏第
"
+
n.ToString()
+
"
天
"
;
if
(firsrD0
>=
s15
&&
firsrD0
<
s15
+
10
)
re
+=
"
末伏第
"
+
n.ToString()
+
"
天
"
;
else
{
if
(firsrD0
>=
s12
+
30
&&
firsrD0
<
s12
+
40
)
re
+=
"
中伏第
"
+
n.ToString()
+
"
天
"
;
if
(firsrD0
>=
s12
+
40
&&
firsrD0
<
s12
+
50
)
re
+=
"
中伏第
"
+
(n
+
10
).ToString()
+
"
天
"
;
}
//
"三九"是指冬至后的第三个九天,约在1月中下旬。"三九"天为什么最冷呢?这要从当时地面吸收和散发热量的多少来看,冬季这时候虽然白昼短,地面吸收的太阳辐射热量最少,但此时地面散发的热量还多于吸收的热量,近地面的空气温度还要继续低下去,当地面吸收到的太阳热量几乎等于地面散发的热量,气温才达到最冷。到"三九"以后,地面吸收的热量又将多于地面散失的热量,近地面的空气温度也随着逐渐回升。因此,一年中最冷的时候一般出现在冬至后的"三九"前后。
//
冬至这一天开始数九,这就是人们所说的“提冬数九”。数上9天是一九,再数9天是二九……数到“九九”就算“九”尽了,“九尽杨花开”,那时天就暖了。
//
人说“冷在九、热在伏”,数九虽冷,但由于我国地域辽阔,冷也冷得不一样:
//
黄河中下游的《九九歌》是:一九二九不出手;三九四 九河上走;五九六九沿河望柳;七九开河,八九雁来;九九又一九,耕牛遍地走。
//
江南的《九九歌》是:一九二九相见弗出手;三九二十七,篱头吹筚篥(古代的一种乐器,意指寒风吹得篱笆噼噼响声);四九三十六,夜晚如鹭宿(晚上寒冷象白鹤一样卷曲着身体睡眠);五九四十五,太阳开门户,六九五十四,贫儿争意气;七九六十三,布袖担头担;八九七十二,猫儿寻阳地;九九八十一,犁耙一齐出。
//
最冷的是三九、四九,在吉林:三九四九冻死狗,在江苏则是“三九四九拾粪老汉满街游”,可见气温相差很大。
//
九九
int
s24
=
(
int
)Math.Floor(Term(y,
24
,
true
));
int
s_24
=
(
int
)Math.Floor(Term(y
-
1
,
24
,
true
));
int
d1
=
thisD0
-
s24;
DateTime a1
=
new
DateTime(y
-
1
,
12
,
31
);
//
DateTime a2=new DateTime(y-1,1,0);
int
d2
=
thisD0
-
s_24
+
a1.DayOfYear
-
1
;
int
w, v;
if
(d1
>=
0
||
d2
<=
80
)
{
if
(solarDateTime.Month
==
12
)
{
w
=
1
;
v
=
d1
+
1
;
if
(v
>
9
)
{
w
+=
1
;
v
-=
9
;
}
}
else
{
w
=
(
int
)Math.Floor((
double
)d2
/
9
)
+
1
;
v
=
(
int
)Math.Round(rem(d2,
9
))
+
1
;
}
re
+=
"
"
+
ToStringWithChineseDay(w).Substring(
1
,
1
)
+
"
九第
"
+
v.ToString()
+
"
天
"
;
}
return
re;
}
#region
节日变量
private
string
[] holiday
=
{
"
0101元旦
"
,
"
0202世界湿地日
"
,
"
0207国际声援南非日
"
,
"
0210国际气象节
"
,
"
0214情人节
"
,
"
0301国际海豹日
"
,
"
0303全国爱耳日
"
,
"
0305学雷锋活动日
"
,
"
0308国际妇女节
"
,
"
0312植树节
"
,
"
0314国际警察日
"
,
"
0315消费者权益日
"
,
"
0317中国国医节 国际航海日
"
,
"
0321世界森林日 消除种族歧视国际日 世界儿歌日
"
,
"
0322世界水日
"
,
"
0323世界气象日
"
,
"
0324世界防治结核病日
"
,
"
0325全国中小学生安全教育日
"
,
"
0330巴勒斯坦国土日
"
,
"
0401愚人节
"
,
"
0407世界卫生日
"
,
"
0422世界地球日
"
,
"
0423世界图书和版权日
"
,
"
0424亚非新闻工作者日
"
,
"
0501国际劳动节
"
,
"
0504五四青年节
"
,
"
0505碘缺乏病防治日
"
,
"
0508世界红十字日
"
,
"
0512国际护士节
"
,
"
0515国际家庭日
"
,
"
0517世界电信日
"
,
"
0518国际博物馆日
"
,
"
0520全国学生营养日
"
,
"
0523国际牛奶日
"
,
"
0531世界无烟日
"
,
"
0601国际儿童节
"
,
"
0605世界环境日
"
,
"
0606全国爱眼日
"
,
"
0617防治荒漠化和干旱日
"
,
"
0623国际奥林匹克日
"
,
"
0625全国土地日
"
,
"
0626国际反毒品日
"
,
"
0701党的生日 香港回归纪念日 世界建筑日
"
,
"
0702国际体育记者日
"
,
"
0707中国人民抗日战争纪念日
"
,
"
0711世界人口日
"
,
"
0730非洲妇女日
"
,
"
0801八一建军节
"
,
"
0908国际扫盲日
"
,
"
0910中国教师节
"
,
"
0914世界清洁地球日
"
,
"
0916国际和平日 国际臭氧层保护日
"
,
"
0918九·一八事变纪念日
"
,
"
0920作者的生日 国际爱牙日
"
,
"
0927世界旅游日
"
,
"
1001国庆节 国际音乐日 国际老人节
"
,
"
1002国际和平与民主自由斗争日
"
,
"
1004世界动物日
"
,
"
1005世界住房日
"
,
"
1008全国高血压日 世界视觉日
"
,
"
1009世界邮政日
"
,
"
1010辛亥革命纪念日 世界精神卫生日
"
,
"
1013世界保健日 国际教师节
"
,
"
1014世界标准日
"
,
"
1015国际盲人节(白手杖节)
"
,
"
1016世界粮食日
"
,
"
1017世界消除贫困日
"
,
"
1022世界传统医药日
"
,
"
1024联合国日 世界发展信息日
"
,
"
1031世界勤俭日 万圣节前夜
"
,
"
1107十月社会主义革命纪念日
"
,
"
1108中国记者日
"
,
"
1109全国消防安全宣传教育日
"
,
"
1110世界青年节
"
,
"
1114世界糖尿病日
"
,
"
1117国际大学生节 世界学生节
"
,
"
1121世界问候日 世界电视日
"
,
"
1129国际声援巴勒斯坦人民国际日
"
,
"
1201世界爱滋病日
"
,
"
1203世界残疾人日
"
,
"
1205国际经济和社会发展志愿人员日
"
,
"
1208国际儿童电视日
"
,
"
1209纪念一二·九运动 世界足球日
"
,
"
1210世界人权日
"
,
"
1212西安事变纪念日
"
,
"
1213南京大屠杀(1937年)纪念日!紧记血泪史!
"
,
"
1221国际篮球日
"
,
"
1224平安夜
"
,
"
1220澳门回归纪念日
"
,
"
1225圣诞节
"
,
"
1229国际生物多样性日
"
};
private
string
[] chineseHoliday
=
{
"
0101新年
"
,
"
0103天庆节
"
,
"
0105五路财神日
"
,
"
0108江东神诞
"
,
"
0109昊天皇帝诞
"
,
"
0111太均娘娘诞
"
,
"
01139散花灯 哥升节
"
,
"
0115元宵节
"
,
"
0116馄饨节 门神诞
"
,
"
0119丘处机诞
"
,
"
0120女娲补天日 黄道婆祭
"
,
"
0125填仓节
"
,
"
0127天地水三官诞
"
,
"
0202龙头节 太昊伏羲氏祭
"
,
"
0203文昌诞
"
,
"
0208芳春节 插花节
"
,
"
0210彩蛋节
"
,
"
0212花朝节
"
,
"
0215老子诞
"
,
"
0219观音诞
"
,
"
0228寒潮节 岱诞
"
,
"
0303上巳节 踏青节
"
,
"
0305大禹诞
"
,
"
0310撒种节
"
,
"
0315孙膑诞 龙华会
"
,
"
0316蒙恬诞
"
,
"
0318中岳节
"
,
"
0320鲁班诞
"
,
"
0322子孙娘娘诞
"
,
"
0323天后玛祖诞
"
,
"
0328仓颉先师诞
"
,
"
0401清和节
"
,
"
0402公输般日
"
,
"
0408洗佛放生节 牛王诞 跳月节
"
,
"
0410葛洪诞
"
,
"
0411孔子祭
"
,
"
0414吕洞宾诞 菖蒲日
"
,
"
0415钟离权诞 外萨卡佛陀日
"
,
"
0417金花女诞
"
,
"
0418锡伯迁移节
"
,
"
0419浣花日
"
,
"
0426炎帝神农氏诞
"
,
"
0428扁鹊诞
"
,
"
0501女儿节
"
,
"
0504采花节
"
,
"
0505端午节
"
,
"
0511范蠡祭
"
,
"
0513关羽诞
"
,
"
0522曹娥日
"
,
"
0529祖娘节
"
,
"
0606天贶节 盘古逝
"
,
"
0612彭祖笺铿诞
"
,
"
0615捕鱼祭
"
,
"
0616爬坡节
"
,
"
0619太阳日 观音日
"
,
"
0623火神诞
"
,
"
0624观莲节
"
,
"
0707乞巧节
"
,
"
0712地狱开门日
"
,
"
0713轩辕诞
"
,
"
0715中元节
"
,
"
0723诸葛亮诞
"
,
"
0727黄老诞
"
,
"
0801天医节
"
,
"
0803华佗诞
"
,
"
0815中秋节
"
,
"
0818观潮节
"
,
"
0824稻节
"
,
"
0909重阳节
"
,
"
0913钉鞋日
"
,
"
0916伯余诞
"
,
"
0919观音逝
"
,
"
0930采参节
"
,
"
1001送寒衣节 祭祖节
"
,
"
1015下元节 文成公主诞
"
,
"
1016盘古节
"
,
"
1208腊八节
"
,
"
1212百福日 蚕花娘娘诞
"
,
"
1223洗灶日
"
,
"
1224小年
"
,
"
1225上帝下界之辰
"
};
private
string
[] celebrity
=
{
"
0104雅各布·格林诞辰
"
,
"
0108周恩来逝世纪念日
"
,
"
0106圣女贞德诞辰
"
,
"
0112杰克·伦敦诞辰
"
,
"
0115莫里哀诞辰
"
,
"
0117富兰克林诞辰
"
,
"
0119瓦特诞辰
"
,
"
0122培根诞辰
"
,
"
0123郎之万诞辰
"
,
"
0127莫扎特诞辰
"
,
"
0129罗曼·罗兰诞辰
"
,
"
0130甘地诞辰
"
,
"
0131舒柏特诞辰
"
,
"
0203门德尔松诞辰
"
,
"
0207门捷列夫诞辰
"
,
"
0211爱迪生诞辰,狄更斯诞辰
"
,
"
0212林肯,达尔文诞辰
"
,
"
0217布鲁诺诞辰
"
,
"
0218伏打诞辰
"
,
"
0219哥白尼诞辰
"
,
"
0222赫兹,叔本华,华盛顿诞辰
"
,
"
0226雨果诞辰
"
,
"
0302斯美塔那诞辰
"
,
"
0304白求恩诞辰
"
,
"
0305周恩来诞辰
"
,
"
0306布朗宁,米开朗琪罗诞辰
"
,
"
0307竺可桢诞辰
"
,
"
0314爱因斯坦诞辰
"
,
"
0321巴赫,穆索尔斯基诞辰
"
,
"
0322贺龙诞辰
"
,
"
0328高尔基诞辰
"
,
"
0401海顿,果戈理诞辰
"
,
"
0415达·芬奇诞辰
"
,
"
0416卓别林诞辰
"
,
"
0420祖冲之诞辰
"
,
"
0422列宁,康德,奥本海默诞辰
"
,
"
0423普朗克,莎士比亚诞辰
"
,
"
0430高斯诞辰
"
,
"
0505马克思诞辰
"
,
"
0507柴可夫斯基,泰戈尔诞辰
"
,
"
0511冼星海诞辰
"
,
"
0511李比希诞辰
"
,
"
0520巴尔扎克诞辰
"
,
"
0522瓦格纳诞辰
"
,
"
0531惠特曼诞辰
"
,
"
0601杜威诞辰
"
,
"
0602哈代诞辰
"
,
"
0608舒曼诞辰
"
,
"
0715伦勃朗诞辰
"
,
"
0805阿贝尔诞辰
"
,
"
0808狄拉克诞辰
"
,
"
0826陈毅诞辰
"
,
"
0828歌德诞辰
"
,
"
0909***逝世纪念日
"
,
"
0925鲁迅诞辰
"
,
"
0926巴甫洛夫诞辰
"
,
"
0928孔子诞辰
"
,
"
0929奥斯特洛夫斯基诞辰
"
,
"
1011伯辽兹诞辰
"
,
"
1021诺贝尔诞辰
"
,
"
1022李斯特诞辰
"
,
"
1026伽罗瓦诞辰
"
,
"
1029李大钊诞辰
"
,
"
1007居里夫人诞辰
"
,
"
1108哈雷诞辰
"
,
"
1112孙中山诞辰
"
,
"
1124刘少奇诞辰
"
,
"
1128恩格斯诞辰
"
,
"
1201朱德诞辰
"
,
"
1205海森堡诞辰
"
,
"
1211玻恩诞辰
"
,
"
1213海涅诞辰
"
,
"
1216贝多芬诞辰
"
,
"
1221斯大林诞辰
"
,
"
1225牛顿诞辰
"
,
"
1226***诞辰
"
,
"
1229阿·托尔斯泰诞辰
"
};
#endregion
#endregion
}
public
class
SolarTerm
{
private
DateTime solarTermDate;
private
string
name;
///
<summary>
///
节气的时间。
///
</summary>
public
DateTime SolarTermDateTime
{
get
{
return
solarTermDate;
}
set
{
solarTermDate
=
value;
}
}
///
<summary>
///
节气名。
///
</summary>
public
string
Name
{
get
{
return
name;
}
set
{
name
=
value;
}
}
}
public
enum
Syzygy
{
///
<summary>
///
非朔非望。(即看到不完整的月亮)
///
</summary>
None,
///
<summary>
///
新月,即朔。
///
</summary>
NewMoon,
///
<summary>
///
满月,即望。
///
</summary>
FullMoon,
}
public
enum
EclipsePhenomena
{
///
<summary>
///
不食。(大概是天狗没有食欲的样子)
///
</summary>
None,
///
<summary>
///
日食
///
</summary>
EclipseOfSun,
///
<summary>
///
月全食
///
</summary>
CompleteEclipseOfTheMoon,
///
<summary>
///
月偏食
///
</summary>
PartialEclipseOfTheMoon,
}
public
class
Eclipse
{
private
DateTime eclipseTime;
private
EclipsePhenomena phenomena;
private
Syzygy syzygy;
///
<summary>
///
日食月食的时间
///
</summary>
public
DateTime DateTime
{
get
{
return
eclipseTime;
}
set
{
eclipseTime
=
value;
}
}
///
<summary>
///
日食月食的类型
///
</summary>
public
EclipsePhenomena Phenomena
{
get
{
return
phenomena;
}
set
{
phenomena
=
value;
}
}
///
<summary>
///
朔望
///
</summary>
public
Syzygy Syzygy
{
get
{
return
syzygy;
}
set
{
syzygy
=
value;
}
}
}
}