Geen omschrijving
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.

SolarMonth.cs 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System;
  2. using System.Collections.Generic;
  3. using Lunar.Util;
  4. // ReSharper disable MemberCanBePrivate.Global
  5. namespace Lunar
  6. {
  7. /// <summary>
  8. /// 阳历月
  9. /// </summary>
  10. public class SolarMonth
  11. {
  12. /// <summary>
  13. /// 年
  14. /// </summary>
  15. public int Year { get; }
  16. /// <summary>
  17. /// 月
  18. /// </summary>
  19. public int Month { get; }
  20. /// <summary>
  21. /// 默认日期
  22. /// </summary>
  23. public SolarMonth(): this(DateTime.Now)
  24. {
  25. }
  26. /// <summary>
  27. /// 通过日期初始化
  28. /// </summary>
  29. /// <param name="date">日期</param>
  30. public SolarMonth(DateTime date): this(date.Year, date.Month)
  31. {
  32. }
  33. /// <summary>
  34. /// 通过年月初始化
  35. /// </summary>
  36. /// <param name="year">年</param>
  37. /// <param name="month">月</param>
  38. public SolarMonth(int year, int month)
  39. {
  40. Year = year;
  41. Month = month;
  42. }
  43. /// <summary>
  44. /// 通过指定日期获取阳历月
  45. /// </summary>
  46. /// <param name="date">日期</param>
  47. /// <returns>阳历月</returns>
  48. public static SolarMonth FromDate(DateTime date)
  49. {
  50. return new SolarMonth(date);
  51. }
  52. /// <summary>
  53. /// 通过指定年月获取阳历月
  54. /// </summary>
  55. /// <param name="year">年</param>
  56. /// <param name="month">月</param>
  57. /// <returns>阳历月</returns>
  58. public static SolarMonth FromYm(int year, int month)
  59. {
  60. return new SolarMonth(year, month);
  61. }
  62. /// <summary>
  63. /// 本月的阳历日期列表
  64. /// </summary>
  65. public List<Solar> Days
  66. {
  67. get
  68. {
  69. var l = new List<Solar>(31);
  70. var d = new Solar(Year, Month, 1);
  71. l.Add(d);
  72. var days = SolarUtil.GetDaysOfMonth(Year, Month);
  73. for (var i = 1; i < days; i++)
  74. {
  75. l.Add(d.Next(i));
  76. }
  77. return l;
  78. }
  79. }
  80. /// <summary>
  81. /// 获取本月的阳历周列表
  82. /// </summary>
  83. /// <param name="start">星期几作为一周的开始,1234560分别代表星期一至星期天</param>
  84. /// <returns>周列表</returns>
  85. public List<SolarWeek> GetWeeks(int start) {
  86. var l = new List<SolarWeek>();
  87. var week = SolarWeek.FromYmd(Year, Month, 1, start);
  88. while (true) {
  89. l.Add(week);
  90. week = week.Next(1, false);
  91. var firstDay = week.FirstDay;
  92. if (firstDay.Year > Year || firstDay.Month > Month) {
  93. break;
  94. }
  95. }
  96. return l;
  97. }
  98. /// <summary>
  99. /// 获取往后推几个月的阳历月,如果要往前推,则月数用负数
  100. /// </summary>
  101. /// <param name="months">月数</param>
  102. /// <returns>阳历月</returns>
  103. public SolarMonth Next(int months)
  104. {
  105. var n = months < 0 ? -1 : 1;
  106. var m = Math.Abs(months);
  107. var y = Year + m / 12 * n;
  108. m = Month + m % 12 * n;
  109. if (m > 12) {
  110. m -= 12;
  111. y++;
  112. } else if (m < 1) {
  113. m += 12;
  114. y--;
  115. }
  116. return new SolarMonth(y, m);
  117. }
  118. /// <inheritdoc />
  119. public override string ToString()
  120. {
  121. return Year + "-" + Month;
  122. }
  123. /// <summary>
  124. /// 完整字符串输出
  125. /// </summary>
  126. public string FullString => Year + "年" + Month + "月";
  127. }
  128. }