Bez popisu
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.

SolarUtil.cs 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. using System;
  2. using System.Collections.Generic;
  3. // ReSharper disable InconsistentNaming
  4. // ReSharper disable IdentifierTypo
  5. namespace Lunar.Util
  6. {
  7. /// <summary>
  8. /// 阳历工具
  9. /// </summary>
  10. public static class SolarUtil
  11. {
  12. /// <summary>
  13. /// 星期
  14. /// </summary>
  15. public static readonly string[] WEEK = { "日", "一", "二", "三", "四", "五", "六" };
  16. /// <summary>
  17. /// 每月天数
  18. /// </summary>
  19. public static readonly int[] DAYS_OF_MONTH = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  20. /// <summary>
  21. /// 星座
  22. /// </summary>
  23. public static readonly string[] XING_ZUO = { "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯", "水瓶", "双鱼" };
  24. /// <summary>
  25. /// 节日
  26. /// </summary>
  27. public static readonly Dictionary<string, string> FESTIVAL = new Dictionary<string, string>
  28. {
  29. { "1-1", "元旦节" },
  30. { "2-14", "情人节" },
  31. { "3-8", "妇女节" },
  32. { "3-12", "植树节" },
  33. { "3-15", "消费者权益日" },
  34. { "4-1", "愚人节" },
  35. { "5-1", "劳动节" },
  36. { "5-4", "青年节" },
  37. { "6-1", "儿童节" },
  38. { "7-1", "建党节" },
  39. { "8-1", "建军节" },
  40. { "9-10", "教师节" },
  41. { "10-1", "国庆节" },
  42. { "10-31", "万圣节前夜" },
  43. { "11-1", "万圣节" },
  44. { "12-24", "平安夜" },
  45. { "12-25", "圣诞节" }
  46. };
  47. /// <summary>
  48. /// 按星期的节日
  49. /// </summary>
  50. public static readonly Dictionary<string, string> WEEK_FESTIVAL = new Dictionary<string, string>
  51. {
  52. { "3-0-1", "全国中小学生安全教育日" },
  53. { "5-2-0", "母亲节" },
  54. { "5-3-0", "全国助残日" },
  55. { "6-3-0", "父亲节" },
  56. { "9-3-6", "全民国防教育日" },
  57. { "10-1-1", "世界住房日" },
  58. { "11-4-4", "感恩节" }
  59. };
  60. /// <summary>
  61. /// 非正式节日
  62. /// </summary>
  63. public static readonly Dictionary<string, List<string>> OTHER_FESTIVAL = new Dictionary<string, List<string>>
  64. {
  65. {"1-8", new List<string>(new[] {"周恩来逝世纪念日"})},
  66. {"1-10", new List<string>(new[] {"中国人民警察节"})},
  67. {"1-14", new List<string>(new[] {"日记情人节"})},
  68. {"1-21", new List<string>(new[] {"列宁逝世纪念日"})},
  69. {"1-26", new List<string>(new[] {"国际海关日"})},
  70. {"1-27", new List<string>(new[] {"国际大屠杀纪念日"})},
  71. {"2-2", new List<string>(new[] {"世界湿地日"})},
  72. {"2-4", new List<string>(new[] {"世界抗癌日"})},
  73. {"2-7", new List<string>(new[] {"京汉铁路罢工纪念日"})},
  74. {"2-10", new List<string>(new[] {"国际气象节"})},
  75. {"2-19", new List<string>(new[] {"邓小平逝世纪念日"})},
  76. {"2-20", new List<string>(new[] {"世界社会公正日"})},
  77. {"2-21", new List<string>(new[] {"国际母语日"})},
  78. {"2-24", new List<string>(new[] {"第三世界青年日"})},
  79. {"3-1", new List<string>(new[] {"国际海豹日"})},
  80. {"3-3", new List<string>(new[] {"世界野生动植物日", "全国爱耳日"})},
  81. {"3-5", new List<string>(new[] {"周恩来诞辰纪念日", "中国青年志愿者服务日"})},
  82. {"3-6", new List<string>(new[] {"世界青光眼日"})},
  83. {"3-7", new List<string>(new[] {"女生节"})},
  84. {"3-12", new List<string>(new[] {"孙中山逝世纪念日"})},
  85. {"3-14", new List<string>(new[] {"马克思逝世纪念日", "白色情人节"})},
  86. {"3-17", new List<string>(new[] {"国际航海日"})},
  87. {"3-18", new List<string>(new[] {"全国科技人才活动日", "全国爱肝日"})},
  88. {"3-20", new List<string>(new[] {"国际幸福日"})},
  89. {"3-21", new List<string>(new[] {"世界森林日", "世界睡眠日", "国际消除种族歧视日"})},
  90. {"3-22", new List<string>(new[] {"世界水日"})},
  91. {"3-23", new List<string>(new[] {"世界气象日"})},
  92. {"3-24", new List<string>(new[] {"世界防治结核病日"})},
  93. {"3-29", new List<string>(new[] {"中国黄花岗七十二烈士殉难纪念日"})},
  94. {"4-2", new List<string>(new[] {"国际儿童图书日", "世界自闭症日"})},
  95. {"4-4", new List<string>(new[] {"国际地雷行动日"})},
  96. {"4-7", new List<string>(new[] {"世界卫生日"})},
  97. {"4-8", new List<string>(new[] {"国际珍稀动物保护日"})},
  98. {"4-12", new List<string>(new[] {"世界航天日"})},
  99. {"4-14", new List<string>(new[] {"黑色情人节"})},
  100. {"4-15", new List<string>(new[] {"全民国家安全教育日"})},
  101. {"4-22", new List<string>(new[] {"世界地球日", "列宁诞辰纪念日"})},
  102. {"4-23", new List<string>(new[] {"世界读书日"})},
  103. {"4-24", new List<string>(new[] {"中国航天日"})},
  104. {"4-25", new List<string>(new[] {"儿童预防接种宣传日"})},
  105. {"4-26", new List<string>(new[] {"世界知识产权日", "全国疟疾日"})},
  106. {"4-28", new List<string>(new[] {"世界安全生产与健康日"})},
  107. {"4-30", new List<string>(new[] {"全国交通安全反思日"})},
  108. {"5-2", new List<string>(new[] {"世界金枪鱼日"})},
  109. {"5-3", new List<string>(new[] {"世界新闻自由日"})},
  110. {"5-5", new List<string>(new[] {"马克思诞辰纪念日"})},
  111. {"5-8", new List<string>(new[] {"世界红十字日"})},
  112. {"5-11", new List<string>(new[] {"世界肥胖日"})},
  113. {"5-12", new List<string>(new[] {"全国防灾减灾日", "护士节"})},
  114. {"5-14", new List<string>(new[] {"玫瑰情人节"})},
  115. {"5-15", new List<string>(new[] {"国际家庭日"})},
  116. {"5-19", new List<string>(new[] {"中国旅游日"})},
  117. {"5-20", new List<string>(new[] {"网络情人节"})},
  118. {"5-22", new List<string>(new[] {"国际生物多样性日"})},
  119. {"5-25", new List<string>(new[] {"525心理健康节"})},
  120. {"5-27", new List<string>(new[] {"上海解放日"})},
  121. {"5-29", new List<string>(new[] {"国际维和人员日"})},
  122. {"5-30", new List<string>(new[] {"中国五卅运动纪念日"})},
  123. {"5-31", new List<string>(new[] {"世界无烟日"})},
  124. {"6-3", new List<string>(new[] {"世界自行车日"})},
  125. {"6-5", new List<string>(new[] {"世界环境日"})},
  126. {"6-6", new List<string>(new[] {"全国爱眼日"})},
  127. {"6-8", new List<string>(new[] {"世界海洋日"})},
  128. {"6-11", new List<string>(new[] {"中国人口日"})},
  129. {"6-14", new List<string>(new[] {"世界献血日", "亲亲情人节"})},
  130. {"6-17", new List<string>(new[] {"世界防治荒漠化与干旱日"})},
  131. {"6-20", new List<string>(new[] {"世界难民日"})},
  132. {"6-21", new List<string>(new[] {"国际瑜伽日"})},
  133. {"6-25", new List<string>(new[] {"全国土地日"})},
  134. {"6-26", new List<string>(new[] {"国际禁毒日", "联合国宪章日"})},
  135. {"7-1", new List<string>(new[] {"香港回归纪念日"})},
  136. {"7-6", new List<string>(new[] {"国际接吻日", "朱德逝世纪念日"})},
  137. {"7-7", new List<string>(new[] {"七七事变纪念日"})},
  138. {"7-11", new List<string>(new[] {"世界人口日", "中国航海日"})},
  139. {"7-14", new List<string>(new[] {"银色情人节"})},
  140. {"7-18", new List<string>(new[] {"曼德拉国际日"})},
  141. {"7-30", new List<string>(new[] {"国际友谊日"})},
  142. {"8-3", new List<string>(new[] {"男人节"})},
  143. {"8-5", new List<string>(new[] {"恩格斯逝世纪念日"})},
  144. {"8-6", new List<string>(new[] {"国际电影节"})},
  145. {"8-8", new List<string>(new[] {"全民健身日"})},
  146. {"8-9", new List<string>(new[] {"国际土著人日"})},
  147. {"8-12", new List<string>(new[] {"国际青年节"})},
  148. {"8-14", new List<string>(new[] {"绿色情人节"})},
  149. {"8-19", new List<string>(new[] {"世界人道主义日", "中国医师节"})},
  150. {"8-22", new List<string>(new[] {"邓小平诞辰纪念日"})},
  151. {"8-29", new List<string>(new[] {"全国测绘法宣传日"})},
  152. {"9-3", new List<string>(new[] {"中国抗日战争胜利纪念日"})},
  153. {"9-5", new List<string>(new[] {"中华慈善日"})},
  154. {"9-8", new List<string>(new[] {"世界扫盲日"})},
  155. {"9-9", new List<string>(new[] {"毛泽东逝世纪念日", "全国拒绝酒驾日"})},
  156. {"9-14", new List<string>(new[] {"世界清洁地球日", "相片情人节"})},
  157. {"9-15", new List<string>(new[] {"国际民主日"})},
  158. {"9-16", new List<string>(new[] {"国际臭氧层保护日"})},
  159. {"9-17", new List<string>(new[] {"世界骑行日"})},
  160. {"9-18", new List<string>(new[] {"九一八事变纪念日"})},
  161. {"9-20", new List<string>(new[] {"全国爱牙日"})},
  162. {"9-21", new List<string>(new[] {"国际和平日"})},
  163. {"9-27", new List<string>(new[] {"世界旅游日"})},
  164. {"9-30", new List<string>(new[] {"中国烈士纪念日"})},
  165. {"10-1", new List<string>(new[] {"国际老年人日"})},
  166. {"10-2", new List<string>(new[] {"国际非暴力日"})},
  167. {"10-4", new List<string>(new[] {"世界动物日"})},
  168. {"10-11", new List<string>(new[] {"国际女童日"})},
  169. {"10-10", new List<string>(new[] {"辛亥革命纪念日"})},
  170. {"10-13", new List<string>(new[] {"国际减轻自然灾害日", "中国少年先锋队诞辰日"})},
  171. {"10-14", new List<string>(new[] {"葡萄酒情人节"})},
  172. {"10-16", new List<string>(new[] {"世界粮食日"})},
  173. {"10-17", new List<string>(new[] {"全国扶贫日"})},
  174. {"10-20", new List<string>(new[] {"世界统计日"})},
  175. {"10-24", new List<string>(new[] {"世界发展信息日", "程序员节"})},
  176. {"10-25", new List<string>(new[] {"抗美援朝纪念日"})},
  177. {"11-5", new List<string>(new[] {"世界海啸日"})},
  178. {"11-8", new List<string>(new[] {"记者节"})},
  179. {"11-9", new List<string>(new[] {"全国消防日"})},
  180. {"11-11", new List<string>(new[] {"光棍节"})},
  181. {"11-12", new List<string>(new[] {"孙中山诞辰纪念日"})},
  182. {"11-14", new List<string>(new[] {"电影情人节"})},
  183. {"11-16", new List<string>(new[] {"国际宽容日"})},
  184. {"11-17", new List<string>(new[] {"国际大学生节"})},
  185. {"11-19", new List<string>(new[] {"世界厕所日"})},
  186. {"11-28", new List<string>(new[] {"恩格斯诞辰纪念日"})},
  187. {"11-29", new List<string>(new[] {"国际声援巴勒斯坦人民日"})},
  188. {"12-1", new List<string>(new[] {"世界艾滋病日"})},
  189. {"12-2", new List<string>(new[] {"全国交通安全日"})},
  190. {"12-3", new List<string>(new[] {"世界残疾人日"})},
  191. {"12-4", new List<string>(new[] {"全国法制宣传日"})},
  192. {"12-5", new List<string>(new[] {"世界弱能人士日", "国际志愿人员日"})},
  193. {"12-7", new List<string>(new[] {"国际民航日"})},
  194. {"12-9", new List<string>(new[] {"世界足球日", "国际反腐败日"})},
  195. {"12-10", new List<string>(new[] {"世界人权日"})},
  196. {"12-11", new List<string>(new[] {"国际山岳日"})},
  197. {"12-12", new List<string>(new[] {"西安事变纪念日"})},
  198. {"12-13", new List<string>(new[] {"国家公祭日"})},
  199. {"12-14", new List<string>(new[] {"拥抱情人节"})},
  200. {"12-18", new List<string>(new[] {"国际移徙者日"})},
  201. {"12-26", new List<string>(new[] {"毛泽东诞辰纪念日"})}
  202. };
  203. /// <summary>
  204. /// 是否闰年
  205. /// </summary>
  206. /// <param name="year">年</param>
  207. /// <returns>true/false 闰年/非闰年</returns>
  208. public static bool IsLeapYear(int year)
  209. {
  210. if (year < 1600)
  211. {
  212. return year % 4 == 0;
  213. }
  214. return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
  215. }
  216. /// <summary>
  217. /// 获取某年有多少天(平年365天,闰年366天)
  218. /// </summary>
  219. /// <param name="year">年</param>
  220. /// <returns>天数</returns>
  221. public static int GetDaysOfYear(int year)
  222. {
  223. if (1582 == year) {
  224. return 355;
  225. }
  226. return IsLeapYear(year) ? 366 : 365;
  227. }
  228. /// <summary>
  229. /// 获取某年某月有多少天
  230. /// </summary>
  231. /// <param name="year">年</param>
  232. /// <param name="month">月</param>
  233. /// <returns>天数</returns>
  234. public static int GetDaysOfMonth(int year, int month)
  235. {
  236. if (1582 == year && 10 == month)
  237. {
  238. return 21;
  239. }
  240. int m = month - 1;
  241. int d = DAYS_OF_MONTH[m];
  242. //公历闰年2月多一天
  243. if (m == 1 && IsLeapYear(year)) {
  244. d++;
  245. }
  246. return d;
  247. }
  248. /// <summary>
  249. /// 获取某天为当年的第几天
  250. /// </summary>
  251. /// <param name="year">年</param>
  252. /// <param name="month">月</param>
  253. /// <param name="day">日</param>
  254. /// <returns>第几天</returns>
  255. public static int GetDaysInYear(int year, int month, int day)
  256. {
  257. var days = 0;
  258. for (var i = 1; i < month; i++)
  259. {
  260. days += GetDaysOfMonth(year, i);
  261. }
  262. var d = day;
  263. if (1582 == year && 10 == month) {
  264. if (day >= 15) {
  265. d -= 10;
  266. } else if (day > 4)
  267. {
  268. throw new ArgumentException($"wrong solar year {year} month {month} day {day}");
  269. }
  270. }
  271. days += d;
  272. return days;
  273. }
  274. /// <summary>
  275. /// 获取某年某月有多少周
  276. /// </summary>
  277. /// <param name="year">年</param>
  278. /// <param name="month">月</param>
  279. /// <param name="start">星期几作为一周的开始,1234560分别代表星期一至星期天</param>
  280. /// <returns>周数</returns>
  281. public static int GetWeeksOfMonth(int year, int month, int start)
  282. {
  283. return (int) Math.Ceiling((GetDaysOfMonth(year, month) + Solar.FromYmdHms(year, month, 1).Week - start) * 1D / WEEK.Length);
  284. }
  285. /// <summary>
  286. /// 获取两个日期之间相差的天数(如果日期a比日期b小,天数为正,如果日期a比日期b大,天数为负)
  287. /// </summary>
  288. /// <param name="ay">年a</param>
  289. /// <param name="am">月a</param>
  290. /// <param name="ad">日a</param>
  291. /// <param name="by">年b</param>
  292. /// <param name="bm">月b</param>
  293. /// <param name="bd">日b</param>
  294. /// <returns>天数</returns>
  295. public static int GetDaysBetween(int ay, int am, int ad, int by, int bm, int bd)
  296. {
  297. int n;
  298. int days;
  299. int i;
  300. if (ay == by)
  301. {
  302. n = GetDaysInYear(by, bm, bd) - GetDaysInYear(ay, am, ad);
  303. }
  304. else if (ay > by)
  305. {
  306. days = GetDaysOfYear(by) - GetDaysInYear(by, bm, bd);
  307. for (i = by + 1; i < ay; i++)
  308. {
  309. days += GetDaysOfYear(i);
  310. }
  311. days += GetDaysInYear(ay, am, ad);
  312. n = -days;
  313. }
  314. else
  315. {
  316. days = GetDaysOfYear(ay) - GetDaysInYear(ay, am, ad);
  317. for (i = ay + 1; i < by; i++)
  318. {
  319. days += GetDaysOfYear(i);
  320. }
  321. days += GetDaysInYear(by, bm, bd);
  322. n = days;
  323. }
  324. return n;
  325. }
  326. }
  327. }