DateUtil.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. using System;
  2. namespace Masuit.Tools.Core.DateTimeExt
  3. {
  4. /// <summary>
  5. /// 日期操作工具类
  6. /// </summary>
  7. public static class DateUtil
  8. {
  9. /// <summary>
  10. /// 返回相对于当前时间的相对天数
  11. /// </summary>
  12. /// <param name="dt"></param>
  13. /// <param name="relativeday">相对天数</param>
  14. public static string GetDateTime(this DateTime dt, int relativeday)
  15. {
  16. return dt.AddDays(relativeday).ToString("yyyy-MM-dd HH:mm:ss");
  17. }
  18. /// <summary>
  19. /// 返回标准时间格式string
  20. /// </summary>
  21. public static string GetDateTimeF(this DateTime dt) => dt.ToString("yyyy-MM-dd HH:mm:ss:fffffff");
  22. /// <summary>
  23. /// 返回标准时间
  24. /// </summary>
  25. /// <param name="fDateTime">日期时间字符串</param>
  26. /// <param name="formatStr">格式</param>
  27. public static string GetStandardDateTime(this string fDateTime, string formatStr)
  28. {
  29. if (fDateTime == "0000-0-0 0:00:00")
  30. {
  31. return fDateTime;
  32. }
  33. var s = Convert.ToDateTime(fDateTime);
  34. return s.ToString(formatStr);
  35. }
  36. /// <summary>
  37. /// 返回标准时间 yyyy-MM-dd HH:mm:ss
  38. /// </summary>
  39. /// <param name="fDateTime">日期时间字符串</param>
  40. public static string GetStandardDateTime(this string fDateTime)
  41. {
  42. return GetStandardDateTime(fDateTime, "yyyy-MM-dd HH:mm:ss");
  43. }
  44. /// <summary>
  45. /// 获取该时间相对于1970-01-01 00:00:00的秒数
  46. /// </summary>
  47. /// <param name="dt"></param>
  48. /// <returns></returns>
  49. public static double GetTotalSeconds(this DateTime dt) => (dt - DateTime.Parse("1970-01-01 00:00:00")).TotalSeconds;
  50. /// <summary>
  51. /// 获取该时间相对于1970-01-01 00:00:00的毫秒数
  52. /// </summary>
  53. /// <param name="dt"></param>
  54. /// <returns></returns>
  55. public static double GetTotalMilliseconds(this DateTime dt) => (dt - DateTime.Parse("1970-01-01 00:00:00")).TotalMilliseconds;
  56. /// <summary>
  57. /// 获取该时间相对于1970-01-01 00:00:00的分钟数
  58. /// </summary>
  59. /// <param name="dt"></param>
  60. /// <returns></returns>
  61. public static double GetTotalMinutes(this DateTime dt) => (dt - DateTime.Parse("1970-01-01 00:00:00")).TotalMinutes;
  62. /// <summary>
  63. /// 获取该时间相对于1970-01-01 00:00:00的小时数
  64. /// </summary>
  65. /// <param name="dt"></param>
  66. /// <returns></returns>
  67. public static double GetTotalHours(this DateTime dt) => (dt - DateTime.Parse("1970-01-01 00:00:00")).TotalHours;
  68. /// <summary>
  69. /// 获取该时间相对于1970-01-01 00:00:00的天数
  70. /// </summary>
  71. /// <param name="dt"></param>
  72. /// <returns></returns>
  73. public static double GetTotalDays(this DateTime dt) => (dt - DateTime.Parse("1970-01-01 00:00:00")).TotalDays;
  74. /// <summary>
  75. /// 返回本年有多少天
  76. /// </summary>
  77. /// <param name="_"></param>
  78. /// <param name="iYear">年份</param>
  79. /// <returns>本年的天数</returns>
  80. public static int GetDaysOfYear(this DateTime _, int iYear)
  81. {
  82. return IsRuYear(iYear) ? 366 : 365;
  83. }
  84. /// <summary>本年有多少天</summary>
  85. /// <param name="dt">日期</param>
  86. /// <returns>本天在当年的天数</returns>
  87. public static int GetDaysOfYear(this DateTime dt)
  88. {
  89. //取得传入参数的年份部分,用来判断是否是闰年
  90. int n = dt.Year;
  91. if (IsRuYear(n))
  92. {
  93. //闰年多 1 天 即:2 月为 29 天
  94. return 366;
  95. }
  96. else
  97. {
  98. //--非闰年少1天 即:2 月为 28 天
  99. return 365;
  100. }
  101. }
  102. /// <summary>本月有多少天</summary>
  103. /// <param name="_"></param>
  104. /// <param name="iYear">年</param>
  105. /// <param name="month">月</param>
  106. /// <returns>天数</returns>
  107. public static int GetDaysOfMonth(this DateTime _, int iYear, int month)
  108. {
  109. int days = 0;
  110. switch (month)
  111. {
  112. case 1:
  113. days = 31;
  114. break;
  115. case 2:
  116. days = IsRuYear(iYear) ? 29 : 28;
  117. break;
  118. case 3:
  119. days = 31;
  120. break;
  121. case 4:
  122. days = 30;
  123. break;
  124. case 5:
  125. days = 31;
  126. break;
  127. case 6:
  128. days = 30;
  129. break;
  130. case 7:
  131. case 8:
  132. days = 31;
  133. break;
  134. case 9:
  135. days = 30;
  136. break;
  137. case 10:
  138. days = 31;
  139. break;
  140. case 11:
  141. days = 30;
  142. break;
  143. case 12:
  144. days = 31;
  145. break;
  146. }
  147. return days;
  148. }
  149. /// <summary>本月有多少天</summary>
  150. /// <param name="dt">日期</param>
  151. /// <returns>天数</returns>
  152. public static int GetDaysOfMonth(this DateTime dt)
  153. {
  154. //--------------------------------//
  155. //从dt中取得当前的年,月信息 --//
  156. //--------------------------------//
  157. int days = 0;
  158. var year = dt.Year;
  159. var month = dt.Month;
  160. //--利用年月信息,得到当前月的天数信息。
  161. switch (month)
  162. {
  163. case 1:
  164. days = 31;
  165. break;
  166. case 2:
  167. days = IsRuYear(year) ? 29 : 28;
  168. break;
  169. case 3:
  170. days = 31;
  171. break;
  172. case 4:
  173. days = 30;
  174. break;
  175. case 5:
  176. days = 31;
  177. break;
  178. case 6:
  179. days = 30;
  180. break;
  181. case 7:
  182. days = 31;
  183. break;
  184. case 8:
  185. days = 31;
  186. break;
  187. case 9:
  188. days = 30;
  189. break;
  190. case 10:
  191. days = 31;
  192. break;
  193. case 11:
  194. days = 30;
  195. break;
  196. case 12:
  197. days = 31;
  198. break;
  199. }
  200. return days;
  201. }
  202. /// <summary>返回当前日期的星期名称</summary>
  203. /// <param name="idt">日期</param>
  204. /// <returns>星期名称</returns>
  205. public static string GetWeekNameOfDay(this DateTime idt)
  206. {
  207. string week = "";
  208. var dt = idt.DayOfWeek.ToString();
  209. switch (dt)
  210. {
  211. case "Mondy":
  212. week = "星期一";
  213. break;
  214. case "Tuesday":
  215. week = "星期二";
  216. break;
  217. case "Wednesday":
  218. week = "星期三";
  219. break;
  220. case "Thursday":
  221. week = "星期四";
  222. break;
  223. case "Friday":
  224. week = "星期五";
  225. break;
  226. case "Saturday":
  227. week = "星期六";
  228. break;
  229. case "Sunday":
  230. week = "星期日";
  231. break;
  232. }
  233. return week;
  234. }
  235. /// <summary>返回当前日期的星期编号</summary>
  236. /// <param name="idt">日期</param>
  237. /// <returns>星期数字编号</returns>
  238. public static string GetWeekNumberOfDay(this DateTime idt)
  239. {
  240. string week = "";
  241. var dt = idt.DayOfWeek.ToString();
  242. switch (dt)
  243. {
  244. case "Mondy":
  245. week = "1";
  246. break;
  247. case "Tuesday":
  248. week = "2";
  249. break;
  250. case "Wednesday":
  251. week = "3";
  252. break;
  253. case "Thursday":
  254. week = "4";
  255. break;
  256. case "Friday":
  257. week = "5";
  258. break;
  259. case "Saturday":
  260. week = "6";
  261. break;
  262. case "Sunday":
  263. week = "7";
  264. break;
  265. }
  266. return week;
  267. }
  268. /// <summary>判断当前年份是否是闰年,私有函数</summary>
  269. /// <param name="iYear">年份</param>
  270. /// <returns>是闰年:True ,不是闰年:False</returns>
  271. private static bool IsRuYear(int iYear)
  272. {
  273. //形式参数为年份
  274. //例如:2003
  275. var n = iYear;
  276. return n % 400 == 0 || n % 4 == 0 && n % 100 != 0;
  277. }
  278. /// <summary>
  279. /// 判断是否为合法日期,必须大于1800年1月1日
  280. /// </summary>
  281. /// <param name="strDate">输入日期字符串</param>
  282. /// <returns>True/False</returns>
  283. public static bool IsDateTime(this string strDate)
  284. {
  285. DateTime.TryParse(strDate, out var result);
  286. return result.CompareTo(DateTime.Parse("1800-1-1")) > 0;
  287. }
  288. }
  289. }