C#计算时间间隔和时间所属区间的通用操作方法

在.net项目中,对DateTime的相关操作使用的比较多,例如时间格式的转换,时间间隔的计算,时间所属的区间计算等,在这些要求中,虽然使用起来较为的简单,但是在转换的过程中,较为容易出错,花费的时间也较多,现在总结一些常用的时间操作方法,以便在项目开发中节省时间。

一下代码中需要使用到如下的实体类:

        /// <summary>
        /// 周(星期)信息实体类
        /// </summary>
        [Serializable]
        public class WeekInfo
        {
            /// <summary>
            /// 周(星期)信息实体类
            /// </summary>
            public WeekInfo()
            {
                Number = 0;
                BeginDate = DateTime.MinValue;
                EndDate = DateTime.MaxValue;
            }
            /// <summary>
            /// 周数
            /// </summary>
            public int Number { get; set; }
            /// <summary>
            /// 开始时间
            /// </summary>
            public DateTime BeginDate { get; set; }
            /// <summary>
            /// 结束时间
            /// </summary>
            public DateTime EndDate { get; set; }
            /// <summary>
            /// 输出第几周和日期间隔
            /// <para>默认格式:</para>
            /// <para>第几周,从2012年12月21日至2112年12月21日。</para>
            /// </summary>
            /// <returns>第几周和日期间隔</returns>
            public override string ToString()
            {
                return string.Format("第{0}周,从{1}至{2}。", Number, BeginDate.ToString("yyyy年MM月dd日"), EndDate.ToString("yyyy年MM月dd日"));
            }

            /// <summary>
            /// 输出第几周
            /// </summary>
            /// <param name="isFill">少于2位时是否补零</param>
            /// <returns>第几周</returns>
            public string GetWeekString(bool isFill)
            {
                string format = "第{0}周";
                if (isFill && Number < 10) format = "第0{0}周";
                return string.Format(format, Number);
            }

            /// <summary>
            /// 输出日期间隔
            /// </summary>
            /// <param name="inputString">输出格式化字符串</param>
            /// <param name="dateString">日期格式化字符串</param>
            /// <returns>日期间隔</returns>
            public string GetDateString(string inputString, string dateString)
            {
                if (string.IsNullOrWhiteSpace(inputString) || string.IsNullOrWhiteSpace(dateString)) return null;
                try
                {
                    return string.Format(inputString, BeginDate.ToString(dateString), EndDate.ToString(dateString));
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
        }

1.获得年度第一个周一的日期:

        /// <summary>
        /// 获得年度第一个周一的日期
        /// </summary>
        /// <param name="year">需要计算的年份</param>
        /// <param name="jumpYear">年度第一周是否跳过跨年的周数</param>
        /// <param name="offset">年度第一个周一偏移量</param>
        /// <returns>年度第一个周一的日期</returns>
        public static DateTime WeekOfFirstDay(int year, bool jumpYear, out int offset)
        {
            var firstDate = YearOfFirstDay(year); //该年的第一天
            var firstWeek = (int)firstDate.DayOfWeek; //该年的第一天是周几
            offset = 0; //周一偏移量
            switch (firstWeek)
            {
                case 1: //星期一
                    offset = 0;
                    break;
                case 2: //星期二
                    offset = jumpYear ? 6 : -1;
                    break;
                case 3: //星期三
                    offset = jumpYear ? 5 : -2;
                    break;
                case 4: //星期四
                    offset = jumpYear ? 4 : -3;
                    break;
                case 5: //星期五
                    offset = jumpYear ? 3 : -4;
                    break;
                case 6: //星期六
                    offset = jumpYear ? 2 : -5;
                    break;
                case 0: //星期日
                    offset = jumpYear ? 1 : -6;
                    break;
            }
            firstDate = firstDate.AddDays(offset);
            return firstDate;
        }

2.获得年度周(星期)信息实体集合列表:

        /// <summary>
        /// 获得年度周(星期)信息实体集合列表
        /// </summary>
        /// <param name="year">需要计算的年份</param>
        /// <param name="jumpYear">年度第一周是否跳过跨年的周数</param>
        /// <returns>周(星期)信息实体集合列表对象</returns>
        public static IList<WeekInfo> WeekOfList(int year, bool jumpYear)
        {
            IList<WeekInfo> weekList = new List<WeekInfo>();
            if (year <= 0001 || year >= 9999) return weekList;
            var offset = 0;
            var firstDate = WeekOfFirstDay(year, jumpYear, out offset); //年度周一的日期
            var index = 1;
            while (true)
            {
                if (index > 54) break;
                var weekInfo = new WeekInfo
                {
                    Number = index,
                    BeginDate = firstDate,
                    EndDate = firstDate.AddDays(6)
                };
                weekList.Add(weekInfo);
                firstDate = firstDate.AddDays(7); //下周
                if (jumpYear)
                {
                    if (firstDate.Year != year) break;
                }
                else
                {
                    if (firstDate.AddDays(6).Year != year) break;
                }
                index++;
            }
            return weekList;
        }

3.获得某年第某周的开始日期和结束日期:

        /// <summary>
        /// 获得某年第某周的开始日期和结束日期
        /// </summary>
        /// <param name="year">需要计算的年份</param>
        /// <param name="weekNumber">需要计算的周数</param>
        /// <param name="jumpYear">年度第一周是否跳过跨年的周数</param>
        /// <param name="weekBeginDate">开始日期</param>
        /// <param name="weekEndDate">结束日期</param>
        public static void WeekOfDate(int year, int weekNumber, bool jumpYear, out DateTime weekBeginDate, out DateTime weekEndDate)
        {
            weekBeginDate = DateTime.MinValue;
            weekEndDate = DateTime.MaxValue;
            if (year <= 0001 || year >= 9999 || weekNumber < 1 || weekNumber > 54) return;
            int offset;
            var firstDate = WeekOfFirstDay(year, jumpYear, out offset); //年度周一的日期
            firstDate = firstDate.AddDays((weekNumber - 1) * 7);
            weekBeginDate = firstDate;
            weekEndDate = firstDate.AddDays(6);
        }

4.获得某个日期属于某年的第几周:

        /// <summary>
        /// 获得某个日期属于某年的第几周
        /// </summary>
        /// <param name="currentDate">需要计算的日期</param>
        /// <param name="jumpYear">年度第一周是否跳过跨年的周数</param>
        /// <returns>某年的第几周</returns>
        public static int WeekOfCurrent(DateTime currentDate, bool jumpYear)
        {
            if (DateTime.MinValue == currentDate || DateTime.MaxValue == currentDate) return 0;
            int result, offset;
            var firstDate = WeekOfFirstDay(currentDate.Year, jumpYear, out offset); //年度周一的日期
            var firstWeek = (int)firstDate.DayOfWeek; //该年的第一天是周几
            var currentDay = currentDate.DayOfYear;
            if (offset > 0)
            {
                currentDay += offset;
            }
            else
            {
                currentDay -= offset;
            }
            var remainderDay = currentDay - (7 - firstWeek);
            if (remainderDay < 1)
            {
                result = 1;
            }
            else
            {
                result = remainderDay / 7;
                if (remainderDay % 7 != 0) result++;
                result++;
            }
            return result;
        }

5.统计一段时间内有多少个星期几:

        /// <summary>
        /// 统计一段时间内有多少个星期几
        /// </summary>
        /// <param name="beginDate">开始日期</param>
        /// <param name="endDate">结束日期</param>
        /// <param name="weekNumber">星期几</param>
        /// <returns>多少个星期几</returns>
        public static int WeekOfTotalWeeks(DateTime beginDate, DateTime endDate, DayOfWeek weekNumber)
        {
            var dayTotal = new TimeSpan(endDate.Ticks - beginDate.Ticks);
            var result = (int)dayTotal.TotalDays / 7;
            var iLen = dayTotal.TotalDays % 7;
            for (var i = 0; i <= iLen; i++)
            {
                if (beginDate.AddDays(i).DayOfWeek != weekNumber) continue;
                result++;
                break;
            }
            return result;
        }

6.计算当前月属于第几季度:

        /// <summary>
        /// 计算当前月属于第几季度
        /// </summary>
        /// <returns>当前年第几季度</returns>
        public static int QuarterOfCurrent()
        {
            return QuarterOfCurrent(DateTime.Now.Month);
        }

        /// <summary>
        /// 计算某个月属于第几季度
        /// </summary>
        /// <param name="month">需要计算的月份</param>
        /// <returns>某年第几季度</returns>
        public static int QuarterOfCurrent(int month)
        {
            if (month < 1 || month > 12) return -1;
            return (month - 1) / 3 + 1;
        }
时间: 2024-10-02 06:20:11

C#计算时间间隔和时间所属区间的通用操作方法的相关文章

Mysql 计算时间间隔函数

#计算两个时间的间隔 #计算间隔天数 select TIMESTAMPDIFF(day,'2014-06-01',date(now())) #计算间隔月数 select TIMESTAMPDIFF(month,'2014-01-01',date(now())) #计算间隔年数 select TIMESTAMPDIFF(year,'2010-01-01',date(now()))Mysql 计算时间间隔函数,布布扣,bubuko.com

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() 实现. 函数 TimeStampDiff() 是MySQL本身提供的可以计算两个时间间隔的函数,语法为: TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之

Powershell计算时间间隔(New-TimeSpan)

在Windows PowerShell里New-TimeSpan cmdlet提供了一种方法做日期算法. 计算时间间隔: 这个命令告诉你今天的日期与2006年除夕之间的天数: New-TimeSpan $(Get-Date) $(Get-Date –month 12 -day 31 -year 2006) New-TimeSpan $(Get-Date) $(Get-Date –month 12 -day 31 -year 2006 -hour 23 -minute 30) 计算从2013/11

js实现的计算两个时间之间的时间差

js实现的计算两个时间之间的时间差:在实际应用中,需要计算两个时间点之间的差距,一般来说都是计算当前时间和一个指定时间点之间的差距,并且有时候需要精确到天.小时.分钟和秒,下面就简单介绍一下如何实现此效果.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.

js计算两个时间相差的天数

day1='2014-03-31 00:00:01'; function get_day(day1,day2){ var s = day1; var dt = Date.parse(s.replace(/-/g,"/")); var day1 = new Date(dt); var s = day2; var dt = Date.parse(s.replace(/-/g,"/")); var day2 = new Date(dt); var date3=day1.g

C/C++中计算两个时间相差的天数

在系统中经常用到time()函数获取系统时间,也就是通常所说的日历时间,这个时间是从1970年1月1日0时开始到现在的秒数. 问:已有日历时间t1和t2(假设t1>t2),如何计算他们之间相差的天数. 答: day = (t1+time_zone*60*60)/time_of_day - (t2+time_zone*60*60)/time_of_day 其中time_zone表示时区间隔,比如说北京时间相比于标准时间就需要加8小时,可以参考下图.time_of_day为一天的秒数,等于24*60

php 计算两个时间的差

<?php $now = time(); $old = strtotime("2014-6-25 10:10:10"); $day = floor(($now-$old)/(60*60*24)); $hour = floor(($now-$old)/(60*24)); $minute = floor(($now-$old)/(60)); $second = $now-$old; echo $minute; ?> 要计算两个时间的差需要把两个时间都转换(strtotime)为

计算时间间隔的js

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> </head> <body> <script> function daysBetween(DateOne,DateTwo) { var OneMonth = DateOne.substring(5,DateOne.lastIndexO

js 计算两个时间的差

比如得到两个时间的字符串 2013-01-21 11:10:49   2013-01-21 11:14:43,要用后面的时间减去前面的时间 直接上代码 var begen = new Date(value[0]["createtime"]) var end = new Date(value[i]["createtime"]) var cha = end.getTime()-begen.getTime(); console.log(cha); console.log(