説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

Yun.cs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using Lunar.Util;
  2. // ReSharper disable MemberCanBePrivate.Global
  3. // ReSharper disable UnusedAutoPropertyAccessor.Global
  4. namespace Lunar.EightChar
  5. {
  6. /// <summary>
  7. /// 运
  8. /// </summary>
  9. public class Yun
  10. {
  11. /// <summary>
  12. /// 性别(1男,0女)
  13. /// </summary>
  14. public int Gender { get; }
  15. /// <summary>
  16. /// 起运年数
  17. /// </summary>
  18. public int StartYear { get; }
  19. /// <summary>
  20. /// 起运月数
  21. /// </summary>
  22. public int StartMonth { get; }
  23. /// <summary>
  24. /// 起运天数
  25. /// </summary>
  26. public int StartDay { get; }
  27. /// <summary>
  28. /// 起运小时
  29. /// </summary>
  30. public int StartHour { get; }
  31. /// <summary>
  32. /// 是否顺推
  33. /// </summary>
  34. public bool Forward { get; }
  35. /// <summary>
  36. /// 阴历
  37. /// </summary>
  38. public Lunar Lunar { get; }
  39. /// <summary>
  40. /// 创建运
  41. /// </summary>
  42. /// <param name="eightChar">八字</param>
  43. /// <param name="gender">性别</param>
  44. /// <param name="sect">流派</param>
  45. public Yun(EightChar eightChar, int gender, int sect = 1)
  46. {
  47. Lunar = eightChar.Lunar;
  48. Gender = gender;
  49. var yang = 0 == Lunar.YearGanIndexExact % 2;
  50. var man = 1 == gender;
  51. Forward = (yang && man) || (!yang && !man);
  52. // 起运计算
  53. var prev = Lunar.GetPrevJie();
  54. var next = Lunar.GetNextJie();
  55. var current = Lunar.Solar;
  56. var start = Forward ? current : prev.Solar;
  57. var end = Forward ? next.Solar : current;
  58. int year;
  59. int month;
  60. int day;
  61. var hour = 0;
  62. if (2 == sect)
  63. {
  64. var minutes = end.SubtractMinute(start);
  65. var y = minutes / 4320;
  66. minutes -= y * 4320;
  67. var m = minutes / 360;
  68. minutes -= m * 360;
  69. var d = minutes / 12;
  70. minutes -= d * 12;
  71. var h = minutes * 2;
  72. year = y;
  73. month = m;
  74. day = d;
  75. hour = h;
  76. }
  77. else
  78. {
  79. var endTimeZhiIndex = (end.Hour == 23) ? 11 : LunarUtil.GetTimeZhiIndex(end.YmdHms.Substring(11, 5));
  80. var startTimeZhiIndex = (start.Hour == 23) ? 11 : LunarUtil.GetTimeZhiIndex(start.YmdHms.Substring(11, 5));
  81. // 时辰差
  82. var hourDiff = endTimeZhiIndex - startTimeZhiIndex;
  83. var dayDiff = end.Subtract(start);
  84. if (hourDiff < 0)
  85. {
  86. hourDiff += 12;
  87. dayDiff--;
  88. }
  89. var monthDiff = hourDiff * 10 / 30;
  90. month = dayDiff * 4 + monthDiff;
  91. day = hourDiff * 10 - monthDiff * 30;
  92. year = month / 12;
  93. month = month - year * 12;
  94. }
  95. StartYear = year;
  96. StartMonth = month;
  97. StartDay = day;
  98. StartHour = hour;
  99. }
  100. /// <summary>
  101. /// 获取起运的阳历日期
  102. /// </summary>
  103. /// <returns>阳历日期</returns>
  104. public Solar StartSolar
  105. {
  106. get
  107. {
  108. var solar = Lunar.Solar;
  109. solar = solar.NextYear(StartYear);
  110. solar = solar.NextMonth(StartMonth);
  111. solar = solar.Next(StartDay);
  112. return solar.NextHour(StartHour);
  113. }
  114. }
  115. /// <summary>
  116. /// 获取大运
  117. /// </summary>
  118. /// <param name="n">轮数</param>
  119. /// <returns>大运</returns>
  120. public DaYun[] GetDaYun(int n = 10)
  121. {
  122. var l = new DaYun[n];
  123. for (var i = 0; i < n; i++)
  124. {
  125. l[i] = new DaYun(this, i);
  126. }
  127. return l;
  128. }
  129. }
  130. }