Merge pull request '😀增加常用工具方法' (#230) from jasondom/Admin.NET.Pro:v2 into v2
Reviewed-on: http://101.43.53.74:3000/Admin.NET/Admin.NET.Pro/pulls/230
This commit is contained in:
commit
cc7d867da5
@ -8,6 +8,38 @@ namespace Admin.NET.Core;
|
||||
|
||||
public class DateTimeUtil
|
||||
{
|
||||
public readonly DateTime Date;
|
||||
|
||||
private DateTimeUtil(TimeSpan timeSpan = default)
|
||||
{
|
||||
Date = DateTime.Now.AddTicks(timeSpan.Ticks);
|
||||
}
|
||||
|
||||
private DateTimeUtil(DateTime time)
|
||||
{
|
||||
Date = time;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 实例化类
|
||||
/// </summary>
|
||||
/// <param name="timeSpan"></param>
|
||||
/// <returns></returns>
|
||||
public static DateTimeUtil Init(TimeSpan timeSpan = default)
|
||||
{
|
||||
return new DateTimeUtil(timeSpan);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 实例化类
|
||||
/// </summary>
|
||||
/// <param name="time"></param>
|
||||
/// <returns></returns>
|
||||
public static DateTimeUtil Init(DateTime time)
|
||||
{
|
||||
return new DateTimeUtil(time);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据unix时间戳的长度自动判断是秒还是以毫秒为单位
|
||||
/// </summary>
|
||||
@ -184,4 +216,181 @@ public class DateTimeUtil
|
||||
// 当前是第几周,若整除7就减一天
|
||||
return ((diffday % 7) == 0 ? (diffday / 7 - 1) : (diffday / 7)) + 1 + (dayInMonth > firstWeekEndDay ? 1 : 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取今天的时间范围
|
||||
/// </summary>
|
||||
/// <returns>返回包含开始时间和结束时间的元组</returns>
|
||||
public (DateTime Start, DateTime End) GetTodayRange()
|
||||
{
|
||||
var start = Date.Date; // 当天开始时间
|
||||
var end = start.AddDays(1).AddSeconds(-1); // 当天结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本月的时间范围
|
||||
/// </summary>
|
||||
/// <returns>返回包含开始时间和结束时间的元组</returns>
|
||||
public (DateTime Start, DateTime End) GetMonthRange()
|
||||
{
|
||||
return (GetFirstDayOfMonth(), GetLastDayOfMonth());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本月的第一天开始时间
|
||||
/// </summary>
|
||||
/// <returns>返回当月的第一天</returns>
|
||||
public DateTime GetFirstDayOfMonth()
|
||||
{
|
||||
return new DateTime(Date.Year, Date.Month, 1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本月的最后一天截至时间
|
||||
/// </summary>
|
||||
/// <returns>返回当月的最后一天</returns>
|
||||
public DateTime GetLastDayOfMonth()
|
||||
{
|
||||
var firstDayOfNextMonth = new DateTime(Date.Year, Date.Month, 1).AddMonths(1);
|
||||
return firstDayOfNextMonth.AddSeconds(-1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取今年的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetYearRange()
|
||||
{
|
||||
return (GetFirstDayOfYear(), GetLastDayOfYear());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取今年的第一天时间范围
|
||||
/// </summary>
|
||||
public DateTime GetFirstDayOfYear()
|
||||
{
|
||||
return new DateTime(Date.Year, 1, 1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取今年的最后一天时间范围
|
||||
/// </summary>
|
||||
public DateTime GetLastDayOfYear()
|
||||
{
|
||||
return new DateTime(Date.Year, 12, 31, 23, 59, 59);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取前天时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetDayBeforeYesterdayRange()
|
||||
{
|
||||
var start = Date.Date.AddDays(-2); // 前天开始时间
|
||||
var end = start.AddDays(1).AddSeconds(-1); // 前天结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取昨天时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetYesterdayRange()
|
||||
{
|
||||
var start = Date.Date.AddDays(-1); // 昨天开始时间
|
||||
var end = start.AddDays(1).AddSeconds(-1); // 昨天结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取上一周时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetLastWeekRange()
|
||||
{
|
||||
// 计算上周的天数差
|
||||
var daysToSubtract = (int)Date.DayOfWeek + 7; // 确保周日也能正确计算
|
||||
var start = Date.Date.AddDays(-daysToSubtract); // 上周第一天
|
||||
var end = start.AddDays(7).AddSeconds(-1); // 上周最后一天
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本周时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetThisWeekRange()
|
||||
{
|
||||
// 计算本周的天数差
|
||||
var daysToSubtract = (int)Date.DayOfWeek;
|
||||
var start = Date.Date.AddDays(-daysToSubtract); // 本周第一天
|
||||
var end = start.AddDays(7).AddSeconds(-1); // 本周最后一天
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取上月时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetLastMonthRange()
|
||||
{
|
||||
var firstDayOfLastMonth = new DateTime(Date.Year, Date.Month, 1).AddMonths(-1); // 上月第一天
|
||||
var lastDayOfLastMonth = firstDayOfLastMonth.AddMonths(1).AddSeconds(-1); // 上月最后一天
|
||||
return (firstDayOfLastMonth, lastDayOfLastMonth);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取近3天的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetLast3DaysRange()
|
||||
{
|
||||
var start = Date.Date.AddDays(-2); // 3天前的开始时间
|
||||
var end = Date.Date.AddDays(1).AddSeconds(-1); // 当前日期的结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取近7天的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetLast7DaysRange()
|
||||
{
|
||||
var start = Date.Date.AddDays(-6); // 7天前的开始时间
|
||||
var end = Date.Date.AddDays(1).AddSeconds(-1); // 当前日期的结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取近15天的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetLast15DaysRange()
|
||||
{
|
||||
var start = Date.Date.AddDays(-14); // 15天前的开始时间
|
||||
var end = Date.Date.AddDays(1).AddSeconds(-1); // 当前日期的结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取近3个月的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetLast3MonthsRange()
|
||||
{
|
||||
var start = Date.Date.AddMonths(-3); // 3个月前的开始时间
|
||||
var end = Date.Date.AddDays(1).AddSeconds(-1); // 当前日期的结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取上半年的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetFirstHalfYearRange()
|
||||
{
|
||||
var start = new DateTime(Date.Year, 1, 1); // 上半年开始时间
|
||||
var end = new DateTime(Date.Year, 6, 30, 23, 59, 59); // 上半年结束时间
|
||||
return (start, end);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下半年的时间范围
|
||||
/// </summary>
|
||||
public (DateTime Start, DateTime End) GetSecondHalfYearRange()
|
||||
{
|
||||
var start = new DateTime(Date.Year, 7, 1); // 下半年开始时间
|
||||
var end = new DateTime(Date.Year, 12, 31, 23, 59, 59); // 下半年结束时间
|
||||
return (start, end);
|
||||
}
|
||||
}
|
||||
133
Admin.NET/Admin.NET.Core/Utils/SafeMath.cs
Normal file
133
Admin.NET/Admin.NET.Core/Utils/SafeMath.cs
Normal file
@ -0,0 +1,133 @@
|
||||
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||
//
|
||||
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||
//
|
||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||
|
||||
using System.Globalization;
|
||||
|
||||
namespace Admin.NET.Core;
|
||||
|
||||
using System;
|
||||
|
||||
/// <summary>
|
||||
/// 安全的基本数学运算方法类
|
||||
/// </summary>
|
||||
public static class SafeMath
|
||||
{
|
||||
/// <summary>
|
||||
/// 安全加法
|
||||
/// </summary>
|
||||
/// <param name="left">左操作数</param>
|
||||
/// <param name="right">右操作数</param>
|
||||
/// <param name="precision">保留小数位数</param>
|
||||
/// <param name="defaultValue">默认值</param>
|
||||
/// <param name="throwOnError">是否抛出异常</param>
|
||||
/// <returns></returns>
|
||||
public static T Add<T>(object left, object right, int precision = 2, T defaultValue = default, bool throwOnError = true) where T : struct, IComparable, IConvertible, IFormattable
|
||||
{
|
||||
return PerformOperation(left, right, (a, b) => a + b, precision, defaultValue, throwOnError);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安全减法
|
||||
/// </summary>
|
||||
/// <param name="left">左操作数</param>
|
||||
/// <param name="right">右操作数</param>
|
||||
/// <param name="precision">保留小数位数</param>
|
||||
/// <param name="defaultValue">默认值</param>
|
||||
/// <param name="throwOnError">是否抛出异常</param>
|
||||
public static T Sub<T>(object left, object right, int precision = 2, T defaultValue = default, bool throwOnError = true) where T : struct, IComparable, IConvertible, IFormattable
|
||||
{
|
||||
return PerformOperation(left, right, (a, b) => a - b, precision, defaultValue, throwOnError);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安全乘法
|
||||
/// </summary>
|
||||
/// <param name="left">左操作数</param>
|
||||
/// <param name="right">右操作数</param>
|
||||
/// <param name="precision">保留小数位数</param>
|
||||
/// <param name="defaultValue">默认值</param>
|
||||
/// <param name="throwOnError">是否抛出异常</param>
|
||||
public static T Mult<T>(object left, object right, int precision = 2, T defaultValue = default, bool throwOnError = true) where T : struct, IComparable, IConvertible, IFormattable
|
||||
{
|
||||
return PerformOperation(left, right, (a, b) => a * b, precision, defaultValue, throwOnError);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安全除法
|
||||
/// </summary>
|
||||
/// <param name="left">左操作数</param>
|
||||
/// <param name="right">右操作数</param>
|
||||
/// <param name="precision">保留小数位数</param>
|
||||
/// <param name="defaultValue">默认值</param>
|
||||
/// <param name="throwOnDivideByZero">是否抛出除以零异常</param>
|
||||
public static T Div<T>(object left, object right, int precision = 2, T defaultValue = default, bool throwOnDivideByZero = true) where T : struct, IComparable, IConvertible, IFormattable
|
||||
{
|
||||
return PerformOperation(left, right, (a, b) =>
|
||||
{
|
||||
if (b != 0) return a / b;
|
||||
if (throwOnDivideByZero) throw new DivideByZeroException("除数不能为0");
|
||||
return SafeConvert<decimal>(defaultValue);
|
||||
}, precision, defaultValue, throwOnDivideByZero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安全类型转换
|
||||
/// </summary>
|
||||
/// <param name="value">数据源</param>
|
||||
/// <param name="defaultValue">默认值</param>
|
||||
public static T SafeConvert<T>(object value, T defaultValue = default) where T : struct, IComparable, IConvertible, IFormattable
|
||||
{
|
||||
if (value == null) return defaultValue;
|
||||
try
|
||||
{
|
||||
return (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
catch
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 执行数学运算
|
||||
/// </summary>
|
||||
private static T PerformOperation<T>(object left, object right, Func<decimal, decimal, decimal> operation, int precision, T defaultValue, bool throwOnError) where T : struct, IComparable, IConvertible, IFormattable
|
||||
{
|
||||
try
|
||||
{
|
||||
decimal leftValue = ConvertToDecimal(left);
|
||||
decimal rightValue = ConvertToDecimal(right);
|
||||
|
||||
decimal result = operation(leftValue, rightValue);
|
||||
return SafeConvert(Math.Round(result, precision, MidpointRounding.AwayFromZero), defaultValue);
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (throwOnError) throw;
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将输入值转换为 decimal
|
||||
/// </summary>
|
||||
public static decimal ConvertToDecimal(object value)
|
||||
{
|
||||
return value switch
|
||||
{
|
||||
null => 0m,
|
||||
int intValue => intValue,
|
||||
float floatValue => (decimal)floatValue,
|
||||
double doubleValue => (decimal)doubleValue,
|
||||
decimal decimalValue => decimalValue,
|
||||
long longValue => longValue,
|
||||
short shortValue => shortValue,
|
||||
byte byteValue => byteValue,
|
||||
string stringValue when decimal.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal parsedValue) => parsedValue, // 尝试解析字符串
|
||||
_ => throw new InvalidCastException($"不支持的类型: {value.GetType().Name}")
|
||||
};
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user