TimeHelper1.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using TEAMModelBI.Models;
  6. using TEAMModelOS.SDK.Models;
  7. using TEAMModelOS.SDK.Models.Cosmos.BI;
  8. namespace TEAMModelBI.Tool
  9. {
  10. public static class TimeHelper1
  11. {
  12. /// <summary>
  13. /// 平年
  14. /// </summary>
  15. public static List<int> flatY = new() { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  16. /// <summary>
  17. /// 闰年
  18. /// </summary>
  19. public static List<int> leapY = new() { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  20. /// <summary>
  21. /// 通过时间戳转换为时间
  22. /// </summary>
  23. /// <param name="timeStamp"></param>
  24. /// <returns></returns>
  25. public static DateTimeOffset GetDateTime(long timeStamp)
  26. {
  27. long begtime = timeStamp * 10000;
  28. DateTimeOffset dt_1970 = new(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
  29. long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度
  30. long time_tricks = tricks_1970 + begtime;//日志日期刻度
  31. DateTimeOffset dt = new DateTime(time_tricks);//转化为DateTime
  32. return dt;
  33. }
  34. /// <summary>
  35. /// 通过string装换为时间并获取时间的年、月、日、一年第几天、小时
  36. /// </summary>
  37. /// <param name="time">时间,例如:2022060706</param>
  38. /// <param name="timeStrType">时间类型: 例如:yyyyMMddHH </param>
  39. /// <returns></returns>
  40. public static (int year,int month,int day, int days, int hour) GetDateTime(string time, string timeStrType = null)
  41. {
  42. string type = "yyyyMMddHH";
  43. if (!string.IsNullOrEmpty(timeStrType))
  44. {
  45. type = timeStrType;
  46. }
  47. int year = 0, month = 0, day = 0, days = 0, hour = 0;
  48. DateTimeOffset dateTime = new();
  49. dateTime = DateTime.ParseExact(time, type, System.Globalization.CultureInfo.CurrentCulture);
  50. year = dateTime.Year;
  51. month = dateTime.Month;
  52. day = dateTime.Day;
  53. DateTimeOffset dt1 = new DateTime(year, 1, 1);
  54. days = (dateTime.Date - dt1.Date).Days + 1;
  55. hour = dateTime.Hour;
  56. return (year, month, day, days, hour);
  57. }
  58. /// <summary>
  59. /// 获取月份的开始和结束时间戳 13位
  60. /// </summary>
  61. /// <param name="year"></param>
  62. /// <param name="month"></param>
  63. /// <returns></returns>
  64. public static (long start, long end) GetMonthStartEnd(int year, int month, bool dateLenth = true)
  65. {
  66. DateTimeOffset dtNew = new(year, month, 1, 0, 0, 0, TimeSpan.Zero);
  67. long start = DateTimeOffset.Parse($"{dtNew}").ToUnixTimeMilliseconds();
  68. if (dateLenth == false) start = DateTimeOffset.Parse($"{dtNew}").ToUnixTimeSeconds();
  69. var ste = dtNew.AddMonths(1).AddDays(-1).Day;
  70. long end = new DateTimeOffset(dtNew.Year, dtNew.Month, ste, 23, 59, 59,TimeSpan.Zero).ToUnixTimeMilliseconds();
  71. // DateTimeOffset.Parse($"{dt.Year}-{dt.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds();
  72. if (dateLenth == false) end = new DateTimeOffset(dtNew.Year, dtNew.Month, dtNew.Day, 23, 59, 59, TimeSpan.Zero).ToUnixTimeSeconds();
  73. //DateTimeOffset.Parse($"{dt.Year}-{dt.Month}-{ste} 23:59:59").ToUnixTimeSeconds();
  74. return (start, end);
  75. }
  76. /// <summary>
  77. /// 通过时间获取当前年开始月份到现在月的开始时间到结束时间 现在月是当前天的结束时间
  78. /// </summary>
  79. /// <param name="date"></param>
  80. /// <param name="dateLenth"></param>
  81. /// <returns></returns>
  82. public static async Task<List<StartEndTime>> GetYearSataMthCtMth(DateTimeOffset date,bool dateLenth = true)
  83. {
  84. int year = date.Year;
  85. int mth = date.Month;
  86. int day = date.Day;
  87. List<StartEndTime> monthStartEnds = new();
  88. for (int i = 1; i <= mth; i++)
  89. {
  90. StartEndTime monthStartEnd = new() { date = $"{year}-{i}" };
  91. //DateTime dt = DateTime.Parse($"{year}-{i}");
  92. DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero);
  93. long start = dtNew.ToUnixTimeMilliseconds();
  94. if (dateLenth == false)
  95. start = DateTimeOffset.Parse($"{dtNew}").ToUnixTimeSeconds();
  96. monthStartEnd.start = start;
  97. long end = 0;
  98. if (i == mth)
  99. {
  100. end = DateTimeOffset.Parse($"{year}-{mth}-{day} 23:59:59").ToUnixTimeMilliseconds();
  101. if (dateLenth == false)
  102. end = DateTimeOffset.Parse($"{year}-{mth}-{day} 23:59:59").ToUnixTimeSeconds();
  103. }
  104. else
  105. {
  106. var ste = dtNew.AddMonths(1).AddDays(-1).Day;
  107. end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds();
  108. if (dateLenth == false)
  109. end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeSeconds();
  110. }
  111. monthStartEnd.end = end;
  112. monthStartEnds.Add(monthStartEnd);
  113. }
  114. return monthStartEnds;
  115. }
  116. /// <summary>
  117. /// 获取今年12个月的月份开始和结束时间戳 13位 10位
  118. /// </summary>
  119. /// <param name="year">年份</param>
  120. /// <param name="dateLenth">true :13位时间戳 false:10位时间戳</param>
  121. /// <returns></returns>
  122. public static List<StartEndTime> GetYearMonthlyStartEnd(int year, bool dateLenth = true)
  123. {
  124. List<StartEndTime> monthStartEnds = new();
  125. for (int i = 1; i <= 12; i++)
  126. {
  127. StartEndTime monthStartEnd = new StartEndTime() { date = $"{year}-{i}" };
  128. //DateTime dt = DateTime.Parse($"{year}-{i}");
  129. DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero);
  130. long start = dtNew.ToUnixTimeMilliseconds();
  131. if (dateLenth == false)
  132. start = dtNew.ToUnixTimeSeconds();
  133. monthStartEnd.start = start;
  134. var ste = dtNew.AddMonths(1).AddDays(-1).Day;
  135. long end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds();
  136. if (dateLenth == false)
  137. end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeSeconds();
  138. monthStartEnd.end = end;
  139. monthStartEnds.Add(monthStartEnd);
  140. }
  141. return monthStartEnds;
  142. }
  143. /// <summary>
  144. /// 获取过去12个月的每月开始和结束的时间戳
  145. /// </summary>
  146. /// <param name="yearMonth">日期</param>
  147. /// <param name="dateLenth">true :13位时间戳 false:10位时间戳</param>
  148. /// <returns></returns>
  149. public static List<StartEndTime> monthsOfYear(string yearMonth, bool dateLenth = true)
  150. {
  151. List<StartEndTime> monthStartEnds = new();
  152. DateTime dateTime = DateTime.Parse(yearMonth);
  153. int year = dateTime.Year;
  154. int month = dateTime.Month;
  155. List<string> months = new();
  156. while (year > dateTime.Year - 1 || month > dateTime.Month)
  157. {
  158. StartEndTime monthStartEnd = new() { date = $"{year}-{month}" };
  159. DateTimeOffset dtNew = new(year, month, 1, 0, 0, 0, TimeSpan.Zero);
  160. long start = dateLenth ? dtNew.ToUnixTimeMilliseconds() : dtNew.ToUnixTimeSeconds();
  161. monthStartEnd.start = start;
  162. var ste = dtNew.AddMonths(1).AddDays(-1).Day;
  163. long end = dateLenth ? DateTimeOffset.Parse($"{dateTime.Year}-{dateTime.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dateTime.Year}-{dateTime.Month}-{ste} 23:59:59").ToUnixTimeSeconds();
  164. monthStartEnd.end = end;
  165. monthStartEnds.Add(monthStartEnd);
  166. months.Add($"{year}-{(month < 10 ? "0" : "") + month}");
  167. month -= 1;
  168. if (month <= 0)
  169. {
  170. year -= 1;
  171. month = 12;
  172. }
  173. }
  174. return monthStartEnds;
  175. }
  176. /// <summary>
  177. /// 获取传过来的时间学期的开始时间戳和结束时间
  178. /// </summary>
  179. /// <param name="dateTime">日期</param>
  180. /// <param name="dateLenth">true :13位时间戳 false:10位时间戳 </param>
  181. /// <returns></returns>
  182. public static (long start, long end) GetTermStartOrEnd(DateTimeOffset dateTime, bool dateLenth = true)
  183. {
  184. long start = 0;
  185. long end = 0;
  186. //DateTime dateTime = tempDateTime;
  187. int year = dateTime.Year;
  188. int month = dateTime.Month;
  189. if (month <= 8 && month >= 3)
  190. {
  191. DateTimeOffset newStart = new(year, 3, 1, 0, 0, 0, TimeSpan.Zero);
  192. start = dateLenth ? DateTimeOffset.Parse($"{newStart}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{newStart}").ToUnixTimeSeconds();
  193. DateTimeOffset newEnd = new(year, 8, 31, 23, 59, 59, TimeSpan.Zero);
  194. end = dateLenth ? DateTimeOffset.Parse($"{newEnd}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{newEnd}").ToUnixTimeSeconds();
  195. }
  196. else
  197. {
  198. //计算当前月份
  199. int days = 0;
  200. if (month >= 9)
  201. {
  202. DateTimeOffset newStart = new(dateTime.Year, 9, 1, 0, 0, 0, TimeSpan.Zero);
  203. start = dateLenth ? newStart.ToUnixTimeMilliseconds() : newStart.ToUnixTimeSeconds();
  204. DateTimeOffset newEnd = new(dateTime.Year + 1, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero);
  205. end = dateLenth ? newEnd.ToUnixTimeMilliseconds() : newEnd.ToUnixTimeSeconds();
  206. }
  207. else
  208. {
  209. DateTimeOffset newStart = new(dateTime.Year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero);
  210. start = dateLenth ? newStart.ToUnixTimeMilliseconds() : newStart.ToUnixTimeSeconds();
  211. DateTimeOffset newEnd = new(dateTime.Year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero);
  212. end = dateLenth ? newEnd.ToUnixTimeMilliseconds() : newEnd.ToUnixTimeSeconds();
  213. }
  214. }
  215. return (start, end);
  216. }
  217. /// <summary>
  218. /// 开始时间和结束时间戳
  219. /// </summary>
  220. /// <param name="dateTime"></param>
  221. /// <param name="type"></param>
  222. /// <param name="dateLenth"></param>
  223. /// <returns></returns>
  224. public static (long start, long end) GetStartOrEnd(DateTimeOffset dateTime, string type = "", bool dateLenth = true)
  225. {
  226. try
  227. {
  228. long start = 0;
  229. long end = 0;
  230. int year = dateTime.Year;
  231. int month = dateTime.Month;
  232. int day = dateTime.Day;
  233. int hour = dateTime.Hour;
  234. DateTimeOffset tempStrart = new();
  235. DateTimeOffset tempEnd = new();
  236. switch (type)
  237. {
  238. //今年开始、结束
  239. case "yearMonth":
  240. tempStrart = new DateTimeOffset(year, 1, 1, 0, 0, 0, TimeSpan.Zero);
  241. tempEnd = new DateTimeOffset(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59, TimeSpan.Zero);
  242. break;
  243. //今年开始、结束
  244. case "year":
  245. tempStrart = new DateTimeOffset(year, 1, 1, 0, 0, 0, TimeSpan.Zero);
  246. tempEnd = new DateTimeOffset(year, 12, DateTime.DaysInMonth(year, 12), 23, 59, 59, TimeSpan.Zero);
  247. break;
  248. //去年开始、结束
  249. case "lastYear":
  250. tempStrart = new DateTimeOffset(year - 1, 1, 1, 0, 0, 0, TimeSpan.Zero);
  251. tempEnd = new DateTimeOffset(year - 1, 12, DateTime.DaysInMonth(year, 12), 23, 59, 59, TimeSpan.Zero);
  252. break;
  253. //本学期
  254. case "term":
  255. if (month <= 8 && month >= 3)
  256. {
  257. tempStrart = new DateTimeOffset(year, 3, 1, 0, 0, 0, TimeSpan.Zero);
  258. tempEnd = new DateTimeOffset(year, 8, 31, 23, 59, 59, TimeSpan.Zero);
  259. }
  260. else
  261. {
  262. //计算当前月份
  263. int days = 0;
  264. if (month >= 9)
  265. {
  266. tempStrart = new DateTimeOffset(year, 9, 1, 0, 0, 0, TimeSpan.Zero);
  267. tempEnd = new DateTimeOffset(year + 1, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero);
  268. }
  269. else
  270. {
  271. tempStrart = new DateTimeOffset(year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero);
  272. tempEnd = new DateTimeOffset(year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero);
  273. }
  274. }
  275. break;
  276. //上学期
  277. case "lastterm":
  278. DateTimeOffset tempDate = new();
  279. if (dateTime.Month > 9)
  280. tempDate = new DateTimeOffset(year, dateTime.Month - 4, 1, 0, 0, 0, TimeSpan.Zero);
  281. else tempDate = new DateTimeOffset(year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero);
  282. if (!string.IsNullOrEmpty($"{tempDate}"))
  283. {
  284. year = tempDate.Year;
  285. month = tempDate.Month;
  286. if (month <= 8 && month >= 3)
  287. {
  288. tempStrart = new DateTimeOffset(year, 3, 1, 0, 0, 0, TimeSpan.Zero);
  289. tempEnd = new DateTimeOffset(year, 8, 31, 23, 59, 59,TimeSpan.Zero);
  290. }
  291. else
  292. {
  293. //计算当前月份
  294. int days = 0;
  295. if (month >= 9)
  296. {
  297. tempStrart = new DateTimeOffset(year, 9, 1, 0, 0, 0, TimeSpan.Zero);
  298. tempEnd = new DateTimeOffset(year + 1, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59,TimeSpan.Zero);
  299. }
  300. else
  301. {
  302. tempStrart = new DateTimeOffset(year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero);
  303. tempEnd = new DateTimeOffset(year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero);
  304. }
  305. }
  306. }
  307. break;
  308. //上个月
  309. case "lastMonth":
  310. tempStrart = new DateTimeOffset(year, month - 1, 1, 0, 0, 0, TimeSpan.Zero);
  311. tempEnd = new DateTimeOffset(year, month - 1, DateTime.DaysInMonth(year, month - 1), 23, 59, 59, TimeSpan.Zero);
  312. break;
  313. //本月1号至当天
  314. case "monthDay":
  315. tempStrart = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero);
  316. tempEnd = new DateTimeOffset(year, month, day, 23, 59, 59, TimeSpan.Zero);
  317. break;
  318. //本月
  319. case "month":
  320. tempStrart = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero);
  321. tempEnd = new DateTimeOffset(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59, TimeSpan.Zero);
  322. break;
  323. //上周
  324. case "week":
  325. DateTimeOffset weekStrart = dateTime.AddDays(-(int)(dateTime.DayOfWeek) + 1);
  326. DateTimeOffset weekEnd = dateTime.AddDays(7 - (int)(dateTime.DayOfWeek));
  327. tempStrart = new DateTimeOffset(weekStrart.Year, weekStrart.Month, weekStrart.Day, 0, 0, 0, TimeSpan.Zero);
  328. tempEnd = new DateTimeOffset(weekEnd.Year, weekEnd.Month, weekEnd.Day, 23, 59, 59, TimeSpan.Zero);
  329. break;
  330. //上周
  331. case "lastweek":
  332. var m = (dateTime.DayOfWeek == DayOfWeek.Sunday ? (DayOfWeek)7 : dateTime.DayOfWeek) - DayOfWeek.Monday;
  333. var s = (dateTime.DayOfWeek == DayOfWeek.Sunday ? (DayOfWeek)7 : dateTime.DayOfWeek) - (DayOfWeek)7;
  334. var Mon = dateTime.AddDays((-7 - m));//星期一
  335. var Sun = dateTime.AddDays((-7 - s)); //星期日
  336. tempStrart = new DateTimeOffset(Mon.Year, Mon.Month, Mon.Day, 0, 0, 0, TimeSpan.Zero);
  337. tempEnd = new DateTimeOffset(Sun.Year, Sun.Month, Sun.Day, 23, 59, 59, TimeSpan.Zero);
  338. break;
  339. //当前小时
  340. case "hour":
  341. tempStrart = new DateTimeOffset(year, month, day, hour, 0, 0, TimeSpan.Zero);
  342. tempEnd = new DateTimeOffset(year, month, day, hour, 59, 59, TimeSpan.Zero);
  343. break;
  344. //当天
  345. default:
  346. tempStrart = new DateTimeOffset(year, month, day, 0, 0, 0, TimeSpan.Zero);
  347. tempEnd = new DateTimeOffset(year, month, day, 23, 59, 59, TimeSpan.Zero);
  348. //start = dateLenth ? DateTimeOffset.Parse($"{dayStart}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dayStart}").ToUnixTimeSeconds();
  349. //end = dateLenth ? DateTimeOffset.Parse($"{dayEnd}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dayEnd}").ToUnixTimeSeconds();
  350. break;
  351. }
  352. start = dateLenth ? tempStrart.ToUnixTimeMilliseconds() : tempStrart.ToUnixTimeSeconds();
  353. end = dateLenth ? tempEnd.ToUnixTimeMilliseconds() : tempEnd.ToUnixTimeSeconds();
  354. return (start, end);
  355. }
  356. catch (Exception ex)
  357. {
  358. throw;
  359. }
  360. }
  361. /// <summary>
  362. /// 将时间戳格式 转换成string类型
  363. /// 例:yyyyMMdd,等string类型
  364. /// </summary>
  365. /// <param name="unixTime"></param>
  366. /// <returns></returns>
  367. public static (string timeStart,string timeEnd) GetUnixToDate(long start,long end = 0,string types="yyyyMMdd")
  368. {
  369. string tStart = "";
  370. string tEnd = "";
  371. DateTimeOffset time = System.TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0));
  372. tStart = time.AddMilliseconds(start).ToString($"{types}");
  373. if (end > 0)
  374. {
  375. tEnd = time.AddMilliseconds(end).ToString($"{types}");
  376. }
  377. return (tStart, tEnd);
  378. }
  379. /// <summary>
  380. /// 获取每天的时间
  381. /// </summary>
  382. /// <param name="dateTime">时间</param>
  383. /// <param name="dayNumber">最近几天</param>
  384. /// <returns></returns>
  385. public static List<string> GetNearDay(DateTimeOffset dateTime,int dayNumber)
  386. {
  387. List<string> days = new();
  388. days = Enumerable.Range(1, dayNumber).Select(i => dateTime.Date.AddDays(-i).ToString("yyyyMMdd")).ToList();
  389. return days;
  390. }
  391. public static List<YearMonth> GetYearMonth(List<double> doubles, int year = 0,int month = 0)
  392. {
  393. List<YearMonth> months = new();
  394. DateTimeOffset dateTime = DateTimeOffset.Now;
  395. if (year == 0)
  396. year = dateTime.Year;
  397. if(month == 0)
  398. month = dateTime.Month;
  399. List<int> isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY;
  400. double[] array = doubles.ToArray();
  401. double ser = doubles.Sum();
  402. int moth = 1;
  403. int primaryD = 0;
  404. for (int i = 0; i < isLeapYear.Count; i++)
  405. {
  406. if (month < moth)
  407. break;
  408. double[] temp = new double[isLeapYear[i]];
  409. Array.ConstrainedCopy(array, primaryD, temp, 0, isLeapYear[i]);
  410. months.Add(new YearMonth() { id = $"{year}-{moth}", cnt = temp.Sum() });
  411. moth += 1;
  412. primaryD += isLeapYear[i];
  413. }
  414. return months;
  415. }
  416. }
  417. }