using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TEAMModelOS.SDK.Models.Cosmos.BI; namespace TEAMModelOS.SDK.Models.Service.BI { public static class TimeHelper { /// /// 平年 /// public static List flatY = new() { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /// /// 闰年 /// public static List leapY = new() { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /// /// 将时间戳转换成时间 /// /// /// /// public static (DateTimeOffset timeS, DateTimeOffset timeE) GetLongToTime(long dateS,long dateE) { DateTimeOffset timeS = new(), timeE = new(); if (dateS > 1000000000000) timeS = DateTimeOffset.FromUnixTimeMilliseconds(dateS); else timeS = DateTimeOffset.FromUnixTimeSeconds(dateS); if (dateE > 1000000000000) timeE = DateTimeOffset.FromUnixTimeMilliseconds(dateE); else timeE = DateTimeOffset.FromUnixTimeSeconds(dateE); return (timeS, timeE); } /// /// 通过时间戳转换为时间 /// /// /// public static DateTimeOffset GetDateTime(long timeStamp) { long begtime = timeStamp * 10000; DateTimeOffset dt_1970 = new(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度 long time_tricks = tricks_1970 + begtime;//日志日期刻度 DateTimeOffset dt = new DateTime(time_tricks);//转化为DateTime return dt; } /// /// 通过string装换为时间并获取时间的年、月、日、一年第几天、小时 /// /// 时间,例如:2022060706 /// 时间类型: 例如:yyyyMMddHH /// public static (int year, int month, int day, int days, int hour) GetDateTime(string time, string timeStrType = null) { string type = "yyyyMMddHH"; if (!string.IsNullOrEmpty(timeStrType)) { type = timeStrType; } int year = 0, month = 0, day = 0, days = 0, hour = 0; DateTimeOffset dateTime = new(); dateTime = DateTime.ParseExact(time, type, System.Globalization.CultureInfo.CurrentCulture); year = dateTime.Year; month = dateTime.Month; day = dateTime.Day; DateTimeOffset dt1 = new DateTime(year, 1, 1); days = (dateTime.Date - dt1.Date).Days + 1; hour = dateTime.Hour; return (year, month, day, days, hour); } /// /// 获取月份的开始和结束时间戳 13位 /// /// /// /// public static (long start, long end) GetMonthStartEnd(int year, int month, bool dateLenth = true) { DateTimeOffset dtNew = new(year, month, 1, 0, 0, 0, TimeSpan.Zero); long start = DateTimeOffset.Parse($"{dtNew}").ToUnixTimeMilliseconds(); if (dateLenth == false) start = DateTimeOffset.Parse($"{dtNew}").ToUnixTimeSeconds(); var ste = dtNew.AddMonths(1).AddDays(-1).Day; long end = new DateTimeOffset(dtNew.Year, dtNew.Month, ste, 23, 59, 59, TimeSpan.Zero).ToUnixTimeMilliseconds(); // DateTimeOffset.Parse($"{dt.Year}-{dt.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds(); if (dateLenth == false) end = new DateTimeOffset(dtNew.Year, dtNew.Month, dtNew.Day, 23, 59, 59, TimeSpan.Zero).ToUnixTimeSeconds(); //DateTimeOffset.Parse($"{dt.Year}-{dt.Month}-{ste} 23:59:59").ToUnixTimeSeconds(); return (start, end); } /// /// 通过时间获取当前年开始月份到现在月的开始时间到结束时间 现在月是当前天的结束时间 /// /// /// /// public static async Task> GetYearSataMthCtMth(DateTimeOffset date, bool dateLenth = true) { int year = date.Year; int mth = date.Month; int day = date.Day; List monthStartEnds = new(); for (int i = 1; i <= mth; i++) { StartEndTime monthStartEnd = new() { date = $"{year}-{i}" }; //DateTime dt = DateTime.Parse($"{year}-{i}"); DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero); long start = dtNew.ToUnixTimeMilliseconds(); if (dateLenth == false) start = DateTimeOffset.Parse($"{dtNew}").ToUnixTimeSeconds(); monthStartEnd.start = start; long end = 0; if (i == mth) { end = DateTimeOffset.Parse($"{year}-{mth}-{day} 23:59:59").ToUnixTimeMilliseconds(); if (dateLenth == false) end = DateTimeOffset.Parse($"{year}-{mth}-{day} 23:59:59").ToUnixTimeSeconds(); } else { var ste = dtNew.AddMonths(1).AddDays(-1).Day; end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds(); if (dateLenth == false) end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeSeconds(); } monthStartEnd.end = end; monthStartEnds.Add(monthStartEnd); } return monthStartEnds; } /// /// 获取今年12个月的月份开始和结束时间戳 13位 10位 /// /// 年份 /// true :13位时间戳 false:10位时间戳 /// public static List GetYearMonthlyStartEnd(int year, bool dateLenth = true) { List monthStartEnds = new(); for (int i = 1; i <= 12; i++) { StartEndTime monthStartEnd = new() { date = $"{year}-{i}" }; //DateTime dt = DateTime.Parse($"{year}-{i}"); DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero); long start = dtNew.ToUnixTimeMilliseconds(); if (dateLenth == false) start = dtNew.ToUnixTimeSeconds(); monthStartEnd.start = start; var ste = dtNew.AddMonths(1).AddDays(-1).Day; long end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeMilliseconds(); if (dateLenth == false) end = DateTimeOffset.Parse($"{dtNew.Year}-{dtNew.Month}-{ste} 23:59:59").ToUnixTimeSeconds(); monthStartEnd.end = end; monthStartEnds.Add(monthStartEnd); } return monthStartEnds; } /// /// 获取过去12个月的每月开始和结束的时间戳 /// /// 日期 /// true :13位时间戳 false:10位时间戳 /// public static List monthsOfYear(string yearMonth, bool dateLenth = true) { List monthStartEnds = new(); DateTime dateTime = DateTime.Parse(yearMonth); int year = dateTime.Year; int month = dateTime.Month; List months = new(); while (year > dateTime.Year - 1 || month > dateTime.Month) { StartEndTime monthStartEnd = new() { date = $"{year}-{month}" }; DateTimeOffset dtNew = new(year, month, 1, 0, 0, 0, TimeSpan.Zero); long start = dateLenth ? dtNew.ToUnixTimeMilliseconds() : dtNew.ToUnixTimeSeconds(); monthStartEnd.start = start; var ste = dtNew.AddMonths(1).AddDays(-1).Day; 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(); monthStartEnd.end = end; monthStartEnds.Add(monthStartEnd); months.Add($"{year}-{(month < 10 ? "0" : "") + month}"); month -= 1; if (month <= 0) { year -= 1; month = 12; } } return monthStartEnds; } /// /// 获取传过来的时间学期的开始时间戳和结束时间 /// /// 日期 /// true :13位时间戳 false:10位时间戳 /// public static (long start, long end) GetTermStartOrEnd(DateTimeOffset dateTime, bool dateLenth = true) { long start = 0; long end = 0; //DateTime dateTime = tempDateTime; int year = dateTime.Year; int month = dateTime.Month; if (month <= 8 && month >= 3) { DateTimeOffset newStart = new(year, 3, 1, 0, 0, 0, TimeSpan.Zero); start = dateLenth ? DateTimeOffset.Parse($"{newStart}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{newStart}").ToUnixTimeSeconds(); DateTimeOffset newEnd = new(year, 8, 31, 23, 59, 59, TimeSpan.Zero); end = dateLenth ? DateTimeOffset.Parse($"{newEnd}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{newEnd}").ToUnixTimeSeconds(); } else { //计算当前月份 int days = 0; if (month >= 9) { DateTimeOffset newStart = new(dateTime.Year, 9, 1, 0, 0, 0, TimeSpan.Zero); start = dateLenth ? newStart.ToUnixTimeMilliseconds() : newStart.ToUnixTimeSeconds(); 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); end = dateLenth ? newEnd.ToUnixTimeMilliseconds() : newEnd.ToUnixTimeSeconds(); } else { DateTimeOffset newStart = new(dateTime.Year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero); start = dateLenth ? newStart.ToUnixTimeMilliseconds() : newStart.ToUnixTimeSeconds(); DateTimeOffset newEnd = new(dateTime.Year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero); end = dateLenth ? newEnd.ToUnixTimeMilliseconds() : newEnd.ToUnixTimeSeconds(); } } return (start, end); } /// /// 开始时间和结束时间戳 /// /// /// /// /// public static (long start, long end) GetStartOrEnd(DateTimeOffset dateTime, string type = "", bool dateLenth = true) { try { long start = 0; long end = 0; int year = dateTime.Year; int month = dateTime.Month; int day = dateTime.Day; int hour = dateTime.Hour; DateTimeOffset tempStrart = new(); DateTimeOffset tempEnd = new(); switch (type) { //今年开始、结束 case "yearMonth": tempStrart = new DateTimeOffset(year, 1, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59, TimeSpan.Zero); break; //今年开始、结束 case "year": tempStrart = new DateTimeOffset(year, 1, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, 12, DateTime.DaysInMonth(year, 12), 23, 59, 59, TimeSpan.Zero); break; //去年开始、结束 case "lastYear": tempStrart = new DateTimeOffset(year - 1, 1, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year - 1, 12, DateTime.DaysInMonth(year, 12), 23, 59, 59, TimeSpan.Zero); break; //本学期 case "term": if (month <= 8 && month >= 3) { tempStrart = new DateTimeOffset(year, 3, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, 8, 31, 23, 59, 59, TimeSpan.Zero); } else { //计算当前月份 int days = 0; if (month >= 9) { tempStrart = new DateTimeOffset(year, 9, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year + 1, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero); } else { tempStrart = new DateTimeOffset(year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero); } } break; //上学期 case "lastterm": DateTimeOffset tempDate = new(); if (dateTime.Month > 9) tempDate = new DateTimeOffset(year, dateTime.Month - 4, 1, 0, 0, 0, TimeSpan.Zero); else { if (dateTime.Month < 3) { tempDate = new DateTimeOffset(year - 1, 3, 1, 0, 0, 0, TimeSpan.Zero); } else { tempDate = new DateTimeOffset(year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero); } } if (!string.IsNullOrEmpty($"{tempDate}")) { year = tempDate.Year; month = tempDate.Month; if (month <= 8 && month >= 3) { tempStrart = new DateTimeOffset(year, 3, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, 8, 31, 23, 59, 59, TimeSpan.Zero); } else { //计算当前月份 int days = 0; if (month >= 9) { tempStrart = new DateTimeOffset(year, 9, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year + 1, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero); } else { tempStrart = new DateTimeOffset(year - 1, 9, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59, TimeSpan.Zero); } } } break; //上个月 case "lastMonth": if (month == 1) { year--; month = 12; } else { month--; } tempStrart = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59, TimeSpan.Zero); break; //本月1号至当天 case "monthDay": tempStrart = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, month, day, 23, 59, 59, TimeSpan.Zero); break; //本月 case "month": tempStrart = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59, TimeSpan.Zero); break; //上周 case "week": DateTimeOffset weekStrart = dateTime.AddDays(-(int)(dateTime.DayOfWeek) + 1); DateTimeOffset weekEnd = dateTime.AddDays(7 - (int)(dateTime.DayOfWeek)); tempStrart = new DateTimeOffset(weekStrart.Year, weekStrart.Month, weekStrart.Day, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(weekEnd.Year, weekEnd.Month, weekEnd.Day, 23, 59, 59, TimeSpan.Zero); break; //上周 case "lastweek": var m = (dateTime.DayOfWeek == DayOfWeek.Sunday ? (DayOfWeek)7 : dateTime.DayOfWeek) - DayOfWeek.Monday; var s = (dateTime.DayOfWeek == DayOfWeek.Sunday ? (DayOfWeek)7 : dateTime.DayOfWeek) - (DayOfWeek)7; var Mon = dateTime.AddDays((-7 - m));//星期一 var Sun = dateTime.AddDays((-7 - s)); //星期日 tempStrart = new DateTimeOffset(Mon.Year, Mon.Month, Mon.Day, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(Sun.Year, Sun.Month, Sun.Day, 23, 59, 59, TimeSpan.Zero); break; //当前小时 case "hour": tempStrart = new DateTimeOffset(year, month, day, hour, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, month, day, hour, 59, 59, TimeSpan.Zero); break; //当天 default: tempStrart = new DateTimeOffset(year, month, day, 0, 0, 0, TimeSpan.Zero); tempEnd = new DateTimeOffset(year, month, day, 23, 59, 59, TimeSpan.Zero); //start = dateLenth ? DateTimeOffset.Parse($"{dayStart}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dayStart}").ToUnixTimeSeconds(); //end = dateLenth ? DateTimeOffset.Parse($"{dayEnd}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dayEnd}").ToUnixTimeSeconds(); break; } start = dateLenth ? tempStrart.ToUnixTimeMilliseconds() : tempStrart.ToUnixTimeSeconds(); end = dateLenth ? tempEnd.ToUnixTimeMilliseconds() : tempEnd.ToUnixTimeSeconds(); return (start, end); } catch (Exception ex) { throw; } } /// /// 计算每年获取开始时间 /// /// /// /// public static List GetYearEveryDay(DateTimeOffset dateTime, bool dateLenth = true,bool isCurrDay = false) { List dayStartEen = new(); int year = dateTime.Year; int curry = dateTime.DayOfYear; List isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY; for (int m = 1; m <= 12; m++) { for (int d = 1; d <= isLeapYear[m - 1]; d++) { if (isCurrDay == true && (curry <= dayStartEen.Count)) break; DateTimeOffset tempStrart = new(year, m, d, 0, 0, 0, TimeSpan.Zero); DateTimeOffset tempEnd = new(year, m, d, 23, 59, 59, TimeSpan.Zero); long longStart = dateLenth ? tempStrart.ToUnixTimeMilliseconds() : tempStrart.ToUnixTimeSeconds(); long longEnd = dateLenth ? tempEnd.ToUnixTimeMilliseconds() : tempEnd.ToUnixTimeSeconds(); dayStartEen.Add(new StartEndTime() { date = $"{year}-{m}-{d}", start = longStart, end = longEnd }); } ////DateTime 有方法 //DateTime monthStart = new DateTime(year, i, 01); //DateTime monthEnd = dateTime.AddMonths(1); //DateTimeOffset tempStrart = new DateTimeOffset(year, i, days, 0, 0, 0, TimeSpan.Zero); //DateTimeOffset tempEnd = new DateTimeOffset(year, i, days, 23, 59, 59, TimeSpan.Zero); } return dayStartEen; } /// /// 将时间戳格式 转换成string类型 /// 例:yyyyMMdd,等string类型 /// /// /// public static (string timeStart, string timeEnd) GetUnixToDate(long start, long end = 0, string types = "yyyyMMdd") { string tStart = ""; string tEnd = ""; DateTimeOffset time = System.TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0)); tStart = time.AddMilliseconds(start).ToString($"{types}"); if (end > 0) { tEnd = time.AddMilliseconds(end).ToString($"{types}"); } return (tStart, tEnd); } /// /// 获取每天的时间 /// /// 时间 /// 最近几天 /// public static List GetNearDay(DateTimeOffset dateTime, int dayNumber) { List days = new(); days = Enumerable.Range(1, dayNumber).Select(i => dateTime.Date.AddDays(-i).ToString("yyyyMMdd")).ToList(); return days; } /// /// 12个月 单个list /// /// /// /// /// public static List GetYearMonth(List doubles, int year = 0, int month = 0) { List months = new(); if (doubles.Count > 0) { DateTimeOffset dateTime = DateTimeOffset.Now; if (year == 0) year = dateTime.Year; if (month == 0) month = dateTime.Month; List isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY; double[] array = doubles.ToArray(); double ser = doubles.Sum(); int moth = 1; int primaryD = 0; for (int i = 0; i < isLeapYear.Count; i++) { if (month < moth) break; double[] temp = new double[isLeapYear[i]]; Array.ConstrainedCopy(array, primaryD, temp, 0, isLeapYear[i]); months.Add(new YearMonth() { id = $"{year}-{moth}", cnt = temp.Sum() }); moth += 1; primaryD += isLeapYear[i]; } } return months; } /// /// 12个月 多个list /// /// /// /// /// public static List GetYearMonths(List> listDoubles, int year = 0, int month = 0) { List months = new(); foreach (var doubles in listDoubles) { if (doubles.Count > 0) { DateTimeOffset dateTime = DateTimeOffset.Now; if (year == 0) year = dateTime.Year; if (month == 0) month = dateTime.Month; List isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY; double[] array = doubles.ToArray(); double ser = doubles.Sum(); int moth = 1; int primaryD = 0; for (int i = 0; i < isLeapYear.Count; i++) { if (month < moth) break; double[] temp = new double[isLeapYear[i]]; Array.ConstrainedCopy(array, primaryD, temp, 0, isLeapYear[i]); months.Add(new YearMonth() { id = $"{year}-{moth}", cnt = temp.Sum() }); moth += 1; primaryD += isLeapYear[i]; } } } return months; } /// /// 依据时间判定当月多少天 /// /// /// public static int GetDateDay(DateTimeOffset dateTime) { int day = 0; int month = dateTime.Month; int year = dateTime.Year; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 4: case 6: case 9: case 11: day = 30; break; case 2: if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) day = 29; else day = 28; break; } return day; } } }