C# 计算两个时间年份月份日期差 DateTime

格式化日期:2026-06-06
当月第一天:2026-06-01
当月最后一天:2026-06-30
获取日期的开始时间(第一秒):2026-06-06 00:00:00
获取日期的结束时间(最后一秒):2026-06-06 23:59:59
时间差:6年6个月6天6小时6分钟6秒
时间对象与时间戳相互转换

1、DateTimeExtensions.cs

using System.Text;
using System.Text.RegularExpressions;

namespace Trial.Common.Extensions
{
    public static class DateTimeExtensions
    {
        /// <summary>
        /// 格式化日期时间
        /// </summary>
        /// <param name="dateTime1">日期时间</param>
        /// <param name="dateMode">显示模式</param>
        /// <returns>0-9种模式的日期</returns>
        public static string FormatDate(DateTime dateTime1, string dateMode)
        {
            switch (dateMode)
            {
                case "0":
                    return dateTime1.ToString("yyyy-MM-dd");
                case "1":
                    return dateTime1.ToString("yyyy-MM-dd HH:mm:ss");
                case "2":
                    return dateTime1.ToString("yyyy/MM/dd");
                case "3":
                    return dateTime1.ToString("yyyy年MM月dd日");
                case "4":
                    return dateTime1.ToString("MM-dd");
                case "5":
                    return dateTime1.ToString("MM/dd");
                case "6":
                    return dateTime1.ToString("MM月dd日");
                case "7":
                    return dateTime1.ToString("yyyy-MM");
                case "8":
                    return dateTime1.ToString("yyyy/MM");
                case "9":
                    return dateTime1.ToString("yyyy年MM月");
                default:
                    return dateTime1.ToString();
            }
        }

        /// <summary>
        /// 时间差【推荐】
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="fullTime">是否显示全部</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static string DateDiff(DateTime startTime, DateTime endTime, bool fullTime = true)
        {
            if (startTime < endTime)
            {
                var t = new
                {
                    bm = startTime.Month,
                    em = endTime.Month,
                    bd = startTime.Day,
                    ed = endTime.Day
                };
                int diffMonth = (endTime.Year - startTime.Year) * 12 + (t.em - t.bm),//相差月
                    diffYear = diffMonth / 12;//相差年

                int[] d = new int[3] { 0, 0, 0 };
                if (diffYear > 0)
                {
                    if (t.em == t.bm && t.ed < t.bd)
                    {
                        d[0] = diffYear - 1;
                    }
                    else d[0] = diffYear;
                }

                if (t.ed >= t.bd)
                {
                    d[1] = diffMonth % 12;
                    d[2] = t.ed - t.bd;
                }
                else//结束日 小于 开始日
                {
                    int dm = diffMonth - 1;
                    d[1] = dm % 12;
                    TimeSpan ts = endTime - startTime.AddMonths(dm);
                    d[2] = ts.Days;
                }
                StringBuilder sb = new StringBuilder();

                if (d.Sum() > 0 || fullTime)
                {
                    #region 如果是0不显示
                    //if (d[0] > 0) sb.Append($"{d[0]}年");
                    //if (d[1] > 0) sb.Append($"{d[1]}个月");
                    //if (d[2] > 0) sb.Append($"{d[2]}天");

                    //int[] time = new int[2] { 0, 0 };
                    //TimeSpan sj = e - b;
                    //time[0] = sj.Hours;
                    //time[1] = sj.Minutes % 60;
                    //if (time[0] > 0) sb.Append($"{time[0]}小时");
                    //if (time[1] > 0) sb.Append($"{time[1]}分钟");

                    //if (time.Sum() <= 0) sb.Append($"{sj.Seconds}秒");
                    #endregion

                    #region 如果是0也显示
                    sb.Append($"{d[0]}年");
                    sb.Append($"{d[1]}个月");
                    sb.Append($"{d[2]}天");

                    int[] time = new int[2] { 0, 0 };
                    TimeSpan sj = endTime - startTime;
                    time[0] = sj.Hours;
                    time[1] = sj.Minutes % 60;
                    sb.Append($"{time[0]}小时");
                    sb.Append($"{time[1]}分钟");

                    sb.Append($"{sj.Seconds}秒");
                    #endregion
                }
                else
                {
                    int[] time = new int[2] { 0, 0 };
                    TimeSpan sj = endTime - startTime;
                    time[0] = sj.Hours;
                    time[1] = sj.Minutes % 60;
                    if (time[0] > 0) sb.Append($"{time[0]}小时");
                    if (time[1] > 0) sb.Append($"{time[1]}分钟");

                    if (time.Sum() <= 0) sb.Append($"{sj.Seconds}秒");
                }
                return sb.ToString();
            }
            else throw new Exception("开始日期必须小于结束日期");
        }

        /// <summary>
        /// 获得两个日期的间隔
        /// </summary>
        /// <param name="DateTime1">日期一。</param>
        /// <param name="DateTime2">日期二。</param>
        /// <returns>日期间隔TimeSpan。</returns>
        public static TimeSpan DateDiff2(DateTime DateTime1, DateTime DateTime2)
        {
            TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
            TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
            TimeSpan ts = ts1.Subtract(ts2).Duration();
            return ts;
        }

        /// <summary>
        /// 当月第一天
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime GetFirstDayOfMonth(this DateTime date)
        {
            DateTime dtFrom = date;
            dtFrom = dtFrom.AddDays(-(dtFrom.Day - 1));
            return dtFrom;
        }

        /// <summary>
        /// 当月最后一天
        /// full date
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime GetLastDayOfMonth(this DateTime date)
        {
            DateTime dtTo = date;
            dtTo = dtTo.AddMonths(1);
            dtTo = dtTo.AddDays(-(dtTo.Day));
            return dtTo;
        }

        /// <summary>
        /// 获取日期的开始时间(第一秒)
        /// </summary>
        /// <returns></returns>
        public static DateTime GetStartOfDay(this DateTime date, int dateMode)
        {
            DateTime startDate = Convert.ToDateTime("2024-6-6 06:06:06");
            DateTime startTime = DateTime.Now;
            if (dateMode == 1)
            {
                DateTime dt = DateTime.Today;
                string start = dt.ToString();
            }
            else if (dateMode == 2)
            {
                DateTime start1 = startDate.Date;
                string startTimeString = start1.ToString();

                /// 动态参数
                startTime = date.Date;
                string startString = startTime.ToString();
            }
            else if (dateMode == 3)
            {
                DateTime start1 = startDate.Date.AddTicks(1);

                /// 动态参数
                startTime = date.Date.AddTicks(1);
            }
            else if (dateMode == 4)
            {
                DateTime dateTime = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd 00:00:00"));

                /// 动态参数
                startTime = Convert.ToDateTime(date.ToString("yyyy-MM-dd 00:00:00"));
            }
            else if (dateMode == 5)
            {
                DateTime start1 = Convert.ToDateTime(startDate.ToString("D").ToString());

                /// 动态参数
                startTime = Convert.ToDateTime(date.ToString("D").ToString());
            }
            else if (dateMode == 6)
            {
                startTime = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);
            }
            return startTime;
        }

        /// <summary>
        /// 获取日期的结束时间(最后一秒)
        /// </summary>
        /// <param name="date"></param>
        /// <param name="dateMode"></param>
        /// <returns></returns>
        public static DateTime GetEndOfDay(this DateTime date, int dateMode)
        {
            DateTime startDate = Convert.ToDateTime("2024-6-6 06:06:06");
            DateTime endTime = DateTime.Now;

            if (dateMode == 1)
            {
                var endDateTime = startDate.Date.AddDays(1).AddMilliseconds(-1);

                /// 动态参数
                endTime = date.Date.AddDays(1).AddMilliseconds(-1);
            }
            else if (dateMode == 2)
            {
                var startDateTime = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd 00:00:00"));
                var endDateTime = startDateTime.AddDays(1).AddMilliseconds(-1);

                /// 动态参数
                var startTime = Convert.ToDateTime(date.ToString("yyyy-MM-dd 00:00:00"));
                endTime = startTime.AddDays(1).AddMilliseconds(-1);
            }
            else if (dateMode == 3)
            {
                DateTime endDateTime = Convert.ToDateTime(startDate.AddDays(1).ToString("D").ToString()).AddSeconds(-1);

                /// 动态参数
                endTime = Convert.ToDateTime(date.AddDays(1).ToString("D").ToString()).AddSeconds(-1);
            }
            else if (dateMode == 4)
            {
                endTime = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);
            }
            return endTime;
        }

        #region 时间对象与时间戳相互转换

        /// <summary>
        /// 将 DateTime 转换为 Unix 时间戳
        /// </summary>
        /// <param name="dateTime">需要转换的时间</param>
        /// <returns>Unix 时间戳</returns>
        public static long DateTimeToUnixTime(this DateTime dateTime)
        {
            return (long)(dateTime - TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0), TimeZoneInfo.Local)).TotalSeconds;
        }

        /// <summary>
        /// 将 Unix 时间戳转换为 DateTime
        /// </summary>
        /// <param name="timestamp">Unix 时间戳</param>
        /// <returns>需要转换的时间</returns>
        public static DateTime UnixTimeToDateTime(this long timestamp)
        {
            if (timestamp < 0)
                throw new ArgumentOutOfRangeException("timestamp is out of range");

            return TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0), TimeZoneInfo.Local).AddSeconds(timestamp);
        }

        #endregion

        #region 判断是否为日期,时间,日期+时间

        /// <summary>
        /// 判断是否为日期
        /// </summary>
        /// <param name="obj">Object</param>
        /// <returns>bool</returns>
        public static bool IsDate(Object obj)
        {
            var result = false;

            if (obj != null)
            {
                result = Regex.IsMatch(obj.ToString(), @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-9]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
            }

            return result;
        }

        /// <summary>
        /// 判断是否为时间
        /// </summary>
        /// <param name="obj">Object对象</param>
        /// <returns>bool</returns>
        public static bool IsTime(Object obj)
        {
            var result = false;

            if (obj != null)
            {
                result = Regex.IsMatch(obj.ToString(), @"^((20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d)$");
            }

            return result;
        }

        /// <summary>
        /// 判断是否为日期+时间
        /// </summary>
        /// <param name="obj">Object对象</param>
        /// <returns>bool</returns>
        public static bool IsDateTime(Object obj)
        {
            var result = false;

            if (obj != null)
            {
                result = Regex.IsMatch(obj.ToString(), @"^(((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d)$ ");
            }

            return result;
        }
        #endregion

    }
}

*、DateTimeUtil.cs

namespace Trial.Common
{
    /// <summary>
    /// Admin.NET 开源项目
    /// </summary>
    public class DateTimeUtil
    {
        /// <summary>
        /// 获取开始时间
        /// </summary>
        /// <param name="dateTime"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        public static DateTime GetBeginTime(DateTime? dateTime, int days = 0)
        {
            if (dateTime == DateTime.MinValue || dateTime == null)
                return DateTime.Now.AddDays(days);

            return dateTime ?? DateTime.Now;
        }

        /// <summary>
        ///  时间戳转本地时间-时间戳精确到秒
        /// </summary>
        public static DateTime ToLocalTimeDateBySeconds(long unix)
        {
            return DateTimeOffset.FromUnixTimeSeconds(unix).ToLocalTime().DateTime;
        }

        /// <summary>
        ///  时间转时间戳Unix-时间戳精确到秒
        /// </summary>
        public static long ToUnixTimestampBySeconds(DateTime dt)
        {
            return new DateTimeOffset(dt).ToUnixTimeSeconds();
        }

        /// <summary>
        ///  时间戳转本地时间-时间戳精确到毫秒
        /// </summary>
        public static DateTime ToLocalTimeDateByMilliseconds(long unix)
        {
            return DateTimeOffset.FromUnixTimeMilliseconds(unix).ToLocalTime().DateTime;
        }

        /// <summary>
        ///  时间转时间戳Unix-时间戳精确到毫秒
        /// </summary>
        public static long ToUnixTimestampByMilliseconds(DateTime dt)
        {
            return new DateTimeOffset(dt).ToUnixTimeMilliseconds();
        }

        /// <summary>
        /// 毫秒转天时分秒
        /// </summary>
        /// <param name="ms"></param>
        /// <returns></returns>
        public static string FormatTime(long ms)
        {
            int ss = 1000;
            int mi = ss * 60;
            int hh = mi * 60;
            int dd = hh * 24;

            long day = ms / dd;
            long hour = (ms - day * dd) / hh;
            long minute = (ms - day * dd - hour * hh) / mi;
            long second = (ms - day * dd - hour * hh - minute * mi) / ss;
            long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;

            string sDay = day < 10 ? "0" + day : "" + day; //天
            string sHour = hour < 10 ? "0" + hour : "" + hour;//小时
            string sMinute = minute < 10 ? "0" + minute : "" + minute;//分钟
            string sSecond = second < 10 ? "0" + second : "" + second;//秒
            string sMilliSecond = milliSecond < 10 ? "0" + milliSecond : "" + milliSecond;//毫秒
            sMilliSecond = milliSecond < 100 ? "0" + sMilliSecond : "" + sMilliSecond;

            return string.Format("{0} 天 {1} 小时 {2} 分 {3} 秒", sDay, sHour, sMinute, sSecond);
        }

        /// <summary>
        /// 获取unix时间戳
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static long GetUnixTimeStamp(DateTime dt)
        {
            return ((DateTimeOffset)dt).ToUnixTimeMilliseconds();
        }

        /// <summary>
        /// 获取日期天的最小时间
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static DateTime GetDayMinDate(DateTime dt)
        {
            return new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
        }

        /// <summary>
        /// 获取日期天的最大时间
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>

        public static DateTime GetDayMaxDate(DateTime dt)
        {
            return new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59);
        }

        /// <summary>
        /// 获取日期天的最大时间
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string FormatDateTime(DateTime? dt)
        {
            if (dt == null) return string.Empty;

            if (dt.Value.Year == DateTime.Now.Year)
                return dt.Value.ToString("MM-dd HH:mm");
            else
                return dt.Value.ToString("yyyy-MM-dd HH:mm");
        }

        /// <summary>
        /// 获取今天日期范围00:00:00 - 23:59:59
        /// </summary>
        /// <returns></returns>
        public static List<DateTime> GetTodayTimeList(DateTime time)
        {
            return new List<DateTime>
            {
                Convert.ToDateTime(time.ToString("D").ToString()),
                Convert.ToDateTime(time.AddDays(1).ToString("D").ToString()).AddSeconds(-1)
            };
        }

        /// <summary>
        /// 获取星期几
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string GetWeekByDate(DateTime dt)
        {
            var day = new[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
            return day[Convert.ToInt32(dt.DayOfWeek.ToString("d"))];
        }

        /// <summary>
        /// 获取这个月的第几周
        /// </summary>
        /// <param name="daytime"></param>
        /// <returns></returns>
        public static int GetWeekNumInMonth(DateTime daytime)
        {
            int dayInMonth = daytime.Day;
            // 本月第一天
            DateTime firstDay = daytime.AddDays(1 - daytime.Day);
            // 本月第一天是周几
            int weekday = firstDay.DayOfWeek == 0 ? 7 : (int)firstDay.DayOfWeek;
            // 本月第一周有几天
            int firstWeekEndDay = 7 - (weekday - 1);
            // 当前日期和第一周之差
            int diffday = dayInMonth - firstWeekEndDay;
            diffday = diffday > 0 ? diffday : 1;
            // 当前是第几周,若整除7就减一天
            return (diffday % 7 == 0 ? diffday / 7 - 1 : diffday / 7) + 1 + (dayInMonth > firstWeekEndDay ? 1 : 0);
        }
    }
}

*

        /// <summary>
        /// 计算两个时间年份月份差
        /// </summary>
        /// <returns></returns>
        public static int GetUsedMonth1()
        {
            try
            {
                DateTime currentDate = DateTime.Now;
                DateTime dynamicTime = Convert.ToDateTime("2017-9-5");
                int year = currentDate.Year - dynamicTime.Year; //相差的年份  
                int month = (currentDate.Year - dynamicTime.Year) * 12 + (currentDate.Month - dynamicTime.Month); //相差的月份
                int month1 = currentDate.Year * 12 + currentDate.Month - dynamicTime.Year * 12 - dynamicTime.Month; //相差的月份

                TimeSpan used = DateTime.Now - dynamicTime;
                double totalDays = used.TotalDays; //相差总天数

                return Convert.ToInt32(month);
            }
            catch (Exception)
            {
                return 0;
            }
        }

*、DateTimeController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MongoDB.Driver.Linq;
using Trial.Contract;

namespace Trial.WebAPI.Controllers
{
    [ApiController]
    [Route("api/DateTime/[action]")]
    public class DateTimeController : ControllerBase
    {
        public DateTimeController() { }

        /// <summary>
        /// 获取日期的开始时间(第一秒)
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetStartOfDay([FromBody] DateTime data)
        {
            DateTime d1 = Common.Extensions.DateTimeExtensions.GetStartOfDay(data, 1);
            DateTime d2 = Common.Extensions.DateTimeExtensions.GetStartOfDay(data, 2);
            DateTime d3 = Common.Extensions.DateTimeExtensions.GetStartOfDay(data, 3);
            DateTime d4 = Common.Extensions.DateTimeExtensions.GetStartOfDay(data, 4);
            DateTime d5 = Common.Extensions.DateTimeExtensions.GetStartOfDay(data, 5);

            return Ok(new
            {
                d1 = d1,
                d2 = d2,
                d3 = d3,
                d4 = d4,
                d5 = d5,
            });
        }

        /// <summary>
        /// 获取日期的结束时间(最后一秒)
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetEndOfDay([FromBody] DateTime data)
        {
            DateTime d1 = Common.Extensions.DateTimeExtensions.GetEndOfDay(data, 1);
            DateTime d2 = Common.Extensions.DateTimeExtensions.GetEndOfDay(data, 2);
            DateTime d3 = Common.Extensions.DateTimeExtensions.GetEndOfDay(data, 3);

            return Ok(new
            {
                d1 = d1,
                d2 = d2,
                d3 = d3,
            });
        }

        [HttpPost]
        public IActionResult GetDateDiff([FromBody] DateDiffInput input)
        {
            var d1 = Common.Extensions.DateTimeExtensions.DateDiff(input.StartTime, input.EndTime, input.FullTime);
            return Ok(new
            {
                d1 = d1,
            });
        }
    }
}

*
*
*

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值