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;
}
}
}