C#根据时间范围获取每月每周的分组

C#根据时间范围获取每月每周的分组

简介:C#根据时间范围获取每月每周的分组,这个时间范围可以是多年(2012.01.01-2015.12.31),

也可以是一年中的几个月(2015.01.01-2015.12.31),也可以是月个月中的几个星期

(2015.01.01-2015.01.21),根据起始日期和结束日期,生成一个以起始日期和结束日期为

键值对的字典(Dictionary<string, string> ),时间仓促,初步写的算法,以后再优化,目前

唯一的一点小遗憾就是,月中每周键值对的排序问题。详细代码如下:

-------------------------------------------------------------------------------------------------------------------------

根据时间范围获取每月每周的分组:

    /// <summary>
    /// 根据时间范围获取每月每周的分组
    /// </summary>
    /// <param name="strStartDate">起始时间</param>
    /// <param name="strEndDate">结束时间</param>
    /// <returns>返回每周起始结束键值对</returns>
    /// <remarks>创建人员(日期):★彭振★(150106 11:12)</remarks>
    public static Dictionary<string, string> GetGroupWeekByDateRange(string strStartDate, string strEndDate)
    {
      Dictionary<string, string> dict = new Dictionary<string, string>();

      DateTime dtStartDate = DateTime.Parse(strStartDate);
      DateTime dtEndDate = DateTime.Parse(strEndDate);

      //同年
      if (dtStartDate.Year == dtEndDate.Year)
      {
        GetGroupWeekByYear(dict, dtStartDate, dtEndDate);
      }
      //不同年
      else
      {
        int WhileCount = dtEndDate.Year - dtStartDate.Year;

        //某年一共有多少天
        int YearDay = DateTime.IsLeapYear(dtStartDate.Year) ? 366 : 365;
        DateTime dtTempStartDate = dtStartDate;

        DateTime dtTempEndDate = dtTempStartDate.AddDays(YearDay - dtTempStartDate.DayOfYear);

        //根据时间范围获取每月每周的分组
        GetGroupWeekByYear(dict, dtTempStartDate, dtTempEndDate);

        for (int i = 1; i < (WhileCount + 1); i++)
        {
          //某年某月一共有多少天
          YearDay = DateTime.IsLeapYear(dtTempStartDate.Year + 1) ? 366 : 365;
          dtTempStartDate = DateTime.Parse(DateTime.Parse((dtTempStartDate.Year + 1) + "." + dtTempStartDate.Month + "." + "01").ToString("yyyy.MM.dd"));
          dtTempEndDate = dtTempStartDate.AddDays(YearDay - dtTempStartDate.DayOfYear);

          //根据时间范围获取每月每周的分组
          GetGroupWeekByYear(dict, dtTempStartDate, dtTempEndDate);

        }
      }

      return dict;
    }

-------------------------------------------------------------------------------------------------------------------------

根据时间范围(年)获取每月每周的分组:

    /// <summary>
    /// 根据时间范围(年)获取每月每周的分组
    /// </summary>
    /// <param name="dict">每周起始结束键值对</param>
    /// <param name="strStartDate">起始时间</param>
    /// <param name="strEndDate">结束时间</param>
    /// <remarks>创建人员(日期):★彭振★(150106 13:58)</remarks>
    public static void GetGroupWeekByYear(Dictionary<string, string> dict, DateTime dtStartDate, DateTime dtEndDate)
    {
      //不同月
      if ((dtEndDate.Month - dtStartDate.Month) >= 1)
      {
        int WhileCount = dtEndDate.Month - dtStartDate.Month;

        //某年某月一共有多少天
        int MonthDay = DateTime.DaysInMonth(dtStartDate.Year, dtStartDate.Month);
        DateTime dtTempStartDate = dtStartDate;
        DateTime dtTempEndDate = dtTempStartDate.AddDays(MonthDay - 1);

        //根据时间范围获取每月每周的分组
        GetGroupWeekByMonth(dict, dtTempStartDate, dtTempEndDate);

        for (int i = 1; i < (WhileCount + 1); i++)
        {
          //某年某月一共有多少天
          MonthDay = DateTime.DaysInMonth(dtTempStartDate.Year, dtTempStartDate.Month + 1);
          dtTempStartDate = DateTime.Parse(DateTime.Parse(dtTempStartDate.Year + "." + (dtTempStartDate.Month + 1) + "." + "01").ToString("yyyy.MM.dd"));
          dtTempEndDate = dtTempStartDate.AddDays(MonthDay - 1);

          //根据时间范围获取每月每周的分组
          GetGroupWeekByMonth(dict, dtTempStartDate, dtTempEndDate);

        }
      }
      //同月
      else
      {
        //根据时间范围获取每月每周的分组
        GetGroupWeekByMonth(dict, dtStartDate, dtEndDate);
      }
    }

-------------------------------------------------------------------------------------------------------------------------

根据时间范围(月)获取每月每周的分组

    /// <summary>
    /// 根据时间范围(月)获取每月每周的分组
    /// </summary>
    /// <param name="dict">每周起始结束键值对</param>
    /// <param name="strStartDate">起始时间</param>
    /// <param name="strEndDate">结束时间</param>
    /// <remarks>创建人员(日期):★彭振★(150106 11:13)</remarks>
    public static void GetGroupWeekByMonth(Dictionary<string, string> dict, DateTime dtStartDate, DateTime dtEndDate)
    {
      //一周
      if ((dtEndDate.Day - dtStartDate.Day) < 7)
      {
        DayOfWeek day = dtStartDate.DayOfWeek;
        string dayString = day.ToString();

        DateTime dtTempStartDate = dtStartDate;
        DateTime dtTempEndDate = dtEndDate;
        DateTime dtTempDate = DateTime.Now;
        switch (dayString)
        {
          case "Monday":
            dict.Add(dtTempStartDate.ToString(), dtTempEndDate.ToString());
            break;
          case "Tuesday":
            dtTempDate = dtTempStartDate.Date.AddDays(+5);
            break;
          case "Wednesday":
            dtTempDate = dtTempStartDate.Date.AddDays(+4);
            break;
          case "Thursday":
            dtTempDate = dtTempStartDate.Date.AddDays(+3);
            break;
          case "Friday":
            dtTempDate = dtTempStartDate.Date.AddDays(+2);
            break;
          case "Saturday":
            dtTempDate = dtTempStartDate.Date.AddDays(+1);
            break;
          case "Sunday":
            dtTempDate = dtTempStartDate;
            break;
        }
        if (!dayString.Equals("Monday"))
        {
          dict.Add(dtTempStartDate.ToString(), dtTempDate.ToString());
          dtTempDate = dtTempDate.Date.AddDays(+1);
          if (DateTime.Compare(dtTempDate, dtEndDate) <= 0)
          {
            dict.Add(dtTempDate.ToString(), dtTempEndDate.ToString());
          }
        }
      }
      //多周
      else
      {
        DayOfWeek day = dtStartDate.DayOfWeek;
        string dayString = day.ToString();

        DateTime dtTempStartDate = dtStartDate;
        DateTime dtTempEndDate = dtEndDate;
        DateTime dtTempDate = DateTime.Now;

        #region 起始

        switch (dayString)
        {
          case "Monday":
            dtTempDate = dtTempStartDate.Date.AddDays(+6);
            break;
          case "Tuesday":
            dtTempDate = dtTempStartDate.Date.AddDays(+5);
            break;
          case "Wednesday":
            dtTempDate = dtTempStartDate.Date.AddDays(+4);
            break;
          case "Thursday":
            dtTempDate = dtTempStartDate.Date.AddDays(+3);
            break;
          case "Friday":
            dtTempDate = dtTempStartDate.Date.AddDays(+2);
            break;
          case "Saturday":
            dtTempDate = dtTempStartDate.Date.AddDays(+1);
            break;
          case "Sunday":
            dtTempDate = dtTempStartDate;
            break;
        }
        dict.Add(dtTempStartDate.ToString(), dtTempDate.ToString());

        dtTempStartDate = dtTempDate.Date.AddDays(+1);
        #endregion

        #region 结束

        day = dtEndDate.DayOfWeek;
        dayString = day.ToString();

        switch (dayString)
        {
          case "Monday":
            dtTempDate = dtEndDate;
            break;
          case "Tuesday":
            dtTempDate = dtEndDate.Date.AddDays(-1);
            break;
          case "Wednesday":
            dtTempDate = dtEndDate.Date.AddDays(-2);
            break;
          case "Thursday":
            dtTempDate = dtEndDate.Date.AddDays(-3);
            break;
          case "Friday":
            dtTempDate = dtEndDate.Date.AddDays(-4);
            break;
          case "Saturday":
            dtTempDate = dtEndDate.Date.AddDays(-5);
            break;
          case "Sunday":
            dtTempDate = dtEndDate.Date.AddDays(-6);
            break;
        }

        dict.Add(dtTempDate.ToString(), dtEndDate.ToString());

        dtTempEndDate = dtTempDate.Date.AddDays(-1);

        #endregion

        int WhileCount = ((dtTempEndDate.Day - dtTempStartDate.Day) / 7);
        if (WhileCount == 0)
        {
          dict.Add(dtTempStartDate.ToString(), dtTempEndDate.ToString());
        }
        else
        {
          for (int i = 0; i < (WhileCount + 1); i++)
          {
            dtTempDate = dtTempStartDate.Date.AddDays(+6);
            dict.Add(dtTempStartDate.ToString(), dtTempDate.ToString());
            dtTempStartDate = dtTempDate.Date.AddDays(+1); ;
          }
        }
      }
    }

-------------------------------------------------------------------------------------------------------------------------

运用:

        //根据时间范围获取每月每周的分组
        Dictionary<string, string> dict = GetGroupWeekByDateRange("2012.01.01", "2015.12.31");
        Dictionary<string, string> dict = GetGroupWeekByDateRange("2015.01.01", "2015.12.31");
        Dictionary<string, string> dict = GetGroupWeekByDateRange("2015.01.01", "2015.01.21");



时间: 2024-08-30 16:40:14

C#根据时间范围获取每月每周的分组的相关文章

根据时间范围获取表名(table_prefix)

分表规则为:每月分两张表.1-15号为 table_prefix_Ym_1 ,16-31号为table_prefix_Ym_2 , 如:table_prefix_201903_1 <?php /** * @purpose: 根据时间范围获取表名 * @explain: 表名的分表规则是,每月分两张表,1-15号为 table_prefix_Ym_1 ,16-31号为table_prefix_2 , 如:table_prefix_201903_1 * User: Chrdai * Date: 20

从titles表获取按照title进行分组

题目描述 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t.CREATE TABLE IF NOT EXISTS "titles" (`emp_no` int(11) NOT NULL,`title` varchar(50) NOT NULL,`from_date` date NOT NULL,`to_date` date DEFAULT NULL); SQL实现 select title, count(emp_no) as tfrom t

SQL Server学习记录之获取每月每季度每年第一天和最后一天

DECLARE@dtdatetime SET@dt=GETDATE() DECLARE@numberint SET@number=3 --1.指定日期该年的第一天或最后一天 --A. 年的第一天 SELECTCONVERT(char(5),@dt,120)+'1-1' --B. 年的最后一天 SELECTCONVERT(char(5),@dt,120)+'12-31' --2.指定日期所在季度的第一天或最后一天 --A. 季度的第一天 SELECTCONVERT(datetime, CONVER

给定一个年月!获取每月每天所对应的星期

public class Test030 {     public static void main(String[] args){         String s = "2013/9";         SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");         sdf1.setLenient(false);         SimpleDateFormat sdf2 = new Sim

PHP获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延

2016年11月1日 16:18:19 星期二 主要用到的函数是 strtotime() strtotime('+1 Tuesday', $timestamp) 获取下周二, 从时间戳$timestamp开始计算, 如果$timestamp留空, 则从当天开始计算 strtotime('+1 month', $timestamp) 获取下个月的x号, 还是以$timestamp开始计算的 1 /** 2 * desc 获取每周X执行的所有日期 3 * @param string $start 开

利用Zabbix API 获取各个分组下的服务器列表以及详细信息

现在越来越多的公司选择使用开源软件Zabbix来做服务器业务监控,其高逼格的用户管理是个亮点,所以可以通过调用它的接口将权限管理应用到很多地方,比如说堡垒机权限.以下是用python简单写了个小脚本,通过定义分组名便可以得到分组下的服务器信息. #coding=utf-8 __author__ = 'Perling' from urllib import urlencode import urllib2 import json def post(post_data):     api_url =

再论 ASP.NET 中获取客户端IP地址

说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方.IP在不同系统中,应用相当广泛,常见的日志记录.广告分区域投放等. 1: HttpContext.Current.Request.ServerVariables["HTTP_VIA"]; 2: HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"

8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)

8第八章CTE递归及分组汇总高级部分(多维数据集) 这里贴图太麻烦...算了 UNION 等集合操作符: UNION 等以第一个 SELECT  的 列明 作为 整个结果集的列明,整个结果集 唯一认可的 唯一逻辑处理阶段 是 ORDER BY 这个意思是说 只有 ORDER BY 是对整个结果集作用的,其它都操作都作用在 UINON 两侧的 子集合中. EXCEPT 操作符也是 提出了重复值的 此外,它认为两个 null 值是相等的, 而 NOT EXISTS 认为两个 null 值不相等, 集

mongodb 分组查询统计去掉重复的记录

mongodb版本号是,MongoDB shell version: 2.4.4 操作环境,shell窗口 ,如下所示: [mongo_user@mongodb_dbs ~]# mongo --port 30100 MongoDB shell version: 2.4.4 connecting to: 127.0.0.1:30000/test mongos> mongos> use pos switched to db pos mongos> 1,先统计分组记录数,以paymentOrd