.net core DateTimeHelper类

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 月的最后一天。

使用场景

  1. 人性化时间展示(如显示 "刚刚" 或 "2小时前")。
  2. 时间范围的校验(如判断预约时间是否重叠)。
  3. 处理工作日逻辑(如计算工作周、添加工作日等)。
  4. 格式化输出和日期的基本操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值