Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Tao.cs 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using Lunar.Util;
  4. using System;
  5. using System.Linq;
  6. // ReSharper disable InconsistentNaming
  7. // ReSharper disable MemberCanBePrivate.Global
  8. // ReSharper disable IdentifierTypo
  9. namespace Lunar
  10. {
  11. /// <summary>
  12. /// 道历
  13. /// </summary>
  14. public class Tao
  15. {
  16. /// <summary>
  17. /// 生年
  18. /// </summary>
  19. public const int BIRTH_YEAR = -2697;
  20. /// <summary>
  21. /// 阴历
  22. /// </summary>
  23. private Lunar Lunar { get; }
  24. /// <summary>
  25. /// 初始化
  26. /// </summary>
  27. /// <param name="lunar">阴历</param>
  28. public Tao(Lunar lunar)
  29. {
  30. Lunar = lunar;
  31. }
  32. /// <summary>
  33. /// 初始化
  34. /// </summary>
  35. /// <param name="lunar">阴历</param>
  36. /// <returns>道历</returns>
  37. public static Tao FromLunar(Lunar lunar)
  38. {
  39. return new Tao(lunar);
  40. }
  41. /// <summary>
  42. /// 初始化
  43. /// </summary>
  44. /// <param name="year">阴历年</param>
  45. /// <param name="month">阴历月</param>
  46. /// <param name="day">阴历日</param>
  47. /// <param name="hour">小时</param>
  48. /// <param name="minute">分钟</param>
  49. /// <param name="second">秒钟</param>
  50. /// <returns>道历</returns>
  51. public static Tao FromYmdHms(int year, int month, int day, int hour = 0, int minute = 0, int second = 0)
  52. {
  53. return FromLunar(Lunar.FromYmdHms(year + BIRTH_YEAR, month, day, hour, minute, second));
  54. }
  55. /// <summary>
  56. /// 年
  57. /// </summary>
  58. public int Year => Lunar.Year - BIRTH_YEAR;
  59. /// <summary>
  60. /// 月
  61. /// </summary>
  62. public int Month => Lunar.Month;
  63. /// <summary>
  64. /// 日
  65. /// </summary>
  66. public int Day => Lunar.Day;
  67. /// <summary>
  68. /// 中文年
  69. /// </summary>
  70. public string YearInChinese
  71. {
  72. get
  73. {
  74. var y = (Year + "").ToCharArray();
  75. var s = new StringBuilder();
  76. for (int i = 0, j = y.Length; i < j; i++)
  77. {
  78. s.Append(LunarUtil.NUMBER[y[i] - '0']);
  79. }
  80. return s.ToString();
  81. }
  82. }
  83. /// <summary>
  84. /// 中文月
  85. /// </summary>
  86. public string MonthInChinese => Lunar.MonthInChinese;
  87. /// <summary>
  88. /// 中文日
  89. /// </summary>
  90. public string DayInChinese => Lunar.DayInChinese;
  91. /// <summary>
  92. /// 节日
  93. /// </summary>
  94. public List<TaoFestival> Festivals
  95. {
  96. get
  97. {
  98. var l = new List<TaoFestival>();
  99. try
  100. {
  101. l.AddRange(TaoUtil.FESTIVAL[Month + "-" + Day]);
  102. }
  103. catch
  104. {
  105. // ignored
  106. }
  107. var jq = Lunar.JieQi;
  108. switch (jq)
  109. {
  110. case "冬至":
  111. l.Add(new TaoFestival("元始天尊圣诞"));
  112. break;
  113. case "夏至":
  114. l.Add(new TaoFestival("灵宝天尊圣诞"));
  115. break;
  116. }
  117. // 八节日
  118. try
  119. {
  120. l.Add(new TaoFestival(TaoUtil.BA_JIE[jq]));
  121. }
  122. catch
  123. {
  124. // ignored
  125. }
  126. // 八会日
  127. try
  128. {
  129. l.Add(new TaoFestival(TaoUtil.BA_HUI[Lunar.DayInGanZhi]));
  130. }
  131. catch
  132. {
  133. // ignored
  134. }
  135. return l;
  136. }
  137. }
  138. private bool IsDayIn(string[] days)
  139. {
  140. var md = Month + "-" + Day;
  141. return days.Any(d => md.Equals(d));
  142. }
  143. /// <summary>
  144. /// 是否三会日
  145. /// </summary>
  146. public bool DaySanHui => IsDayIn(TaoUtil.SAN_HUI);
  147. /// <summary>
  148. /// 是否三元日
  149. /// </summary>
  150. public bool DaySanYuan => IsDayIn(TaoUtil.SAN_YUAN);
  151. /// <summary>
  152. /// 是否五腊日
  153. /// </summary>
  154. public bool DayWuLa => IsDayIn(TaoUtil.WU_LA);
  155. /// <summary>
  156. /// 是否八节日
  157. /// </summary>
  158. public bool DayBaJie => TaoUtil.BA_JIE.ContainsKey(Lunar.JieQi);
  159. /// <summary>
  160. /// 是否八会日
  161. /// </summary>
  162. public bool DayBaHui => TaoUtil.BA_HUI.ContainsKey(Lunar.DayInGanZhi);
  163. /// <summary>
  164. /// 是否明戊日
  165. /// </summary>
  166. public bool DayMingWu => "戊".Equals(Lunar.DayGan);
  167. /// <summary>
  168. /// 是否暗戊日
  169. /// </summary>
  170. public bool DayAnWu => Lunar.DayZhi.Equals(TaoUtil.AN_WU[Math.Abs(Month) - 1]);
  171. /// <summary>
  172. /// 是否戊日
  173. /// </summary>
  174. public bool DayWu => DayMingWu || DayAnWu;
  175. /// <summary>
  176. /// 是否天赦日
  177. /// </summary>
  178. public bool DayTianShe
  179. {
  180. get
  181. {
  182. var ret = false;
  183. var mz = Lunar.MonthZhi;
  184. var dgz = Lunar.DayInGanZhi;
  185. if ("寅卯辰".Contains(mz))
  186. {
  187. if ("戊寅".Equals(dgz))
  188. {
  189. ret = true;
  190. }
  191. }
  192. else if ("巳午未".Contains(mz))
  193. {
  194. if ("甲午".Equals(dgz))
  195. {
  196. ret = true;
  197. }
  198. }
  199. else if ("申酉戌".Contains(mz))
  200. {
  201. if ("戊申".Equals(dgz))
  202. {
  203. ret = true;
  204. }
  205. }
  206. else if ("亥子丑".Contains(mz))
  207. {
  208. if ("甲子".Equals(dgz))
  209. {
  210. ret = true;
  211. }
  212. }
  213. return ret;
  214. }
  215. }
  216. /// <summary>
  217. /// 完整字符串输出
  218. /// </summary>
  219. public string FullString => "道歷" + YearInChinese + "年,天運" + Lunar.YearInGanZhi + "年," + Lunar.MonthInGanZhi + "月," + Lunar.DayInGanZhi + "日。" + MonthInChinese + "月" + DayInChinese + "日," + Lunar.TimeZhi + "時。";
  220. /// <inheritdoc />
  221. public override string ToString()
  222. {
  223. return YearInChinese + "年" + MonthInChinese + "月" + DayInChinese;
  224. }
  225. }
  226. }