using System;
namespace CommonUtilities
{
/// <summary>
/// 日期时间工具类
/// </summary>
public static class DateTimeHelper
{
#region 基本操作
/// <summary>
/// 获取当前时间的时间戳 (秒级 Unix 时间戳)
/// </summary>
public static long GetCurrentTimestamp()
{
return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
}
/// <summary>
/// 将 Unix 时间戳 (秒级) 转换为 DateTime
/// </summary>
public static DateTime TimestampToDateTime(long timestamp)
{
return new DateTime(1970, 1, 1).AddSeconds(timestamp).ToLocalTime();
}
/// <summary>
/// 计算两个日期之间的天数
/// </summary>
public static int DaysBetween(DateTime date1, DateTime date2)
{
return (date2 - date1).Days;
}
/// <summary>
/// 判断两个日期是否为同一天
/// </summary>
public static bool IsSameDay(DateTime date1, DateTime date2)
{
return date1.Date == date2.Date;
}
/// <summary>
/// 判断指定时间是否在指定时间段内
/// </summary>
public static bool IsInTimeRange(DateTime time, DateTime startTime, DateTime endTime)
{
return time >= startTime && time <= endTime;
}
#endregion
#region 时间格式化
/// <summary>
/// 返回人性化的时间格式,例如 "刚刚"、"2小时前" 等
/// </summary>
public static string ToFriendlyTime(DateTime dateTime)
{
var timeSpan = DateTime.Now - dateTime;
if (timeSpan.TotalSeconds < 60)
return "刚刚";
if (timeSpan.TotalMinutes < 60)
return $"{(int)timeSpan.TotalMinutes}分钟前";
if (timeSpan.TotalHours < 24)
return $"{(int)timeSpan.TotalHours}小时前";
if (timeSpan.TotalDays < 7)
return $"{(int)timeSpan.TotalDays}天前";
return dateTime.ToString("yyyy-MM-dd");
}
/// <summary>
/// 返回指定格式的时间字符串 (带默认值)
/// </summary>
public static string ToFormattedString(DateTime dateTime, string format = "yyyy-MM-dd HH:mm:ss")
{
return dateTime.ToString(format);
}
/// <summary>
/// 尝试解析指定格式的日期字符串
/// </summary>
public static bool TryParseExact(string dateString, string format, out DateTime parsedDate)
{
return DateTime.TryParseExact(dateString, format, null, System.Globalization.DateTimeStyles.None, out parsedDate);
}
#endregion
#region 工作日相关
/// <summary>
/// 判断是否是工作日 (周一到周五)
/// </summary>
public static bool IsWeekday(DateTime dateTime)
{
return dateTime.DayOfWeek != DayOfWeek.Saturday && dateTime.DayOfWeek != DayOfWeek.Sunday;
}
/// <summary>
/// 判断是否是周末 (周六或周日)
/// </summary>
public static bool IsWeekend(DateTime dateTime)
{
return dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday;
}
/// <summary>
/// 计算从指定日期开始的第 n 个工作日
/// </summary>
public static DateTime AddWorkdays(DateTime startDate, int workdays)
{
var currentDate = startDate;
var daysAdded = 0;
while (daysAdded < workdays)
{
currentDate = currentDate.AddDays(1);
if (IsWeekday(currentDate))
{
daysAdded++;
}
}
return currentDate;
}
/// <summary>
/// 获取某一日期起始的工作周 (周一到周五)
/// </summary>
public static (DateTime Start, DateTime End) GetWorkweekRange(DateTime date)
{
var dayOfWeek = date.DayOfWeek;
var start = date;
if (dayOfWeek == DayOfWeek.Saturday)
start = date.AddDays(-5);
else if (dayOfWeek == DayOfWeek.Sunday)
start = date.AddDays(-6);
else
start = date.AddDays(-((int)dayOfWeek - 1));
return (start.Date, start.AddDays(4).Date); // 周一到周五
}
#endregion
#region 时间段操作
/// <summary>
/// 获取两个时间段的交集
/// </summary>
public static (DateTime? Start, DateTime? End) GetTimeRangeIntersection(DateTime start1, DateTime end1, DateTime start2, DateTime end2)
{
var intersectStart = start1 > start2 ? start1 : start2; // 取较晚的开始时间
var intersectEnd = end1 < end2 ? end1 : end2; // 取较早的结束时间
if (intersectStart <= intersectEnd)
return (intersectStart, intersectEnd); // 有效交集
return (null, null); // 无交集
}
/// <summary>
/// 判断两个时间段是否有重叠
/// </summary>
public static bool AreTimeRangesOverlapping(DateTime start1, DateTime end1, DateTime start2, DateTime end2)
{
return start1 < end2 && end1 > start2;
}
#endregion
#region 特殊日期
/// <summary>
/// 获取某一年中特定月份的第一天
/// </summary>
public static DateTime GetFirstDayOfMonth(int year, int month)
{
return new DateTime(year, month, 1);
}
/// <summary>
/// 获取某一年中特定月份的最后一天
/// </summary>
public static DateTime GetLastDayOfMonth(int year, int month)
{
return new DateTime(year, month, DateTime.DaysInMonth(year, month));
}
/// <summary>
/// 获取当前年份的第一天
/// </summary>
public static DateTime GetFirstDayOfYear(int year)
{
return new DateTime(year, 1, 1);
}
/// <summary>
/// 获取当前年份的最后一天
/// </summary>
public static DateTime GetLastDayOfYear(int year)
{
return new DateTime(year, 12, 31);
}
#endregion
}
}
方法示例简介
1. 基础日期时间操作
GetCurrentTimestamp():获取当前时间的 Unix 时间戳(1970 年起的秒数)。TimestampToDateTime(1685000000):将秒级时间戳转为 DateTime 对象。IsInTimeRange(time, start, end):判断时间是否在指定范围内。
2. 格式化和解析
ToFriendlyTime(dateTime):将 DateTime 转换为人性化的字符串,比如“刚刚”、“1小时前”、“3天前”等。ToFormattedString(dateTime, "yyyy-MM-dd"):格式化时间为指定格式。TryParseExact("2023-09-15", "yyyy-MM-dd"):判断字符串是否能解析为指定格式的 DateTime。
3. 工作日工具
IsWeekday(dateTime):是否是工作日(周一到周五)。AddWorkdays(startDate, 10):从指定日期开始,获取第 n 个工作日。GetWorkweekRange(date):计算以某天为基准的工作周范围。
4. 时间段计算
GetTimeRangeIntersection(start1, end1, start2, end2):计算两个时间段的交集。AreTimeRangesOverlapping(start1, end1, start2, end2):判断两个时间段是否有重叠。
5. 特殊日期
GetFirstDayOfMonth(2023, 9):获取 2023 年 9 月 1 日。GetLastDayOfMonth(2023, 9):获取 2023 年 9 月的最后一天。
使用场景
- 人性化时间展示(如显示 "刚刚" 或 "2小时前")。
- 时间范围的校验(如判断预约时间是否重叠)。
- 处理工作日逻辑(如计算工作周、添加工作日等)。
- 格式化输出和日期的基本操作。