计算某时间是年中第几周。

1:第一种逻辑计算某天是这年中的第几周,别且当这天是年初且他所在周数是中的某天是属于上一天的,那么就把这天归属为上一年最后一周。

代码如下:

 public  int GetDayWeekOfYear(DateTime time)   
        {

            DateTime firstDate = new DateTime(time.Year, 1, 1);

            int FirstIntervalDayOfYear = GetFirstIntervalDayOfYear(firstDate);
            int currentDays = Convert.ToInt32(time.DayOfYear)-FirstIntervalDayOfYear;
            int n = currentDays/ 7+1;
            if (currentDays % 7== 0)
                n=n - 1;
            if (currentDays < 1 ) //当currentDays < 1说明所选日期在这年第几天还不够这年中头几天在上一年第一周的年数,说明这周是属于上一年最后一周的
            {
                n = GetDayWeekOfYear(new DateTime(time.Year - 1, 12, 31));
            }
            return n;
        }

        public int GetFirstIntervalDayOfYear(DateTime date)  //取这年中头几天是和上一年同在一个星期内的。
        {
         
            if ((int)date.DayOfWeek != 1)
            {
                return (8 - (int)date.DayOfWeek)%7;
            }
            return 0;
         
        }

2:第二种逻辑在跨年的周里面,看那年占的天数多,就归属到那一年所以2012-12-31日在那周只占用2012年的一天,但是2013年占六天,所以这周应该都归属到2013年,包括2012-12-31这天

代码如下:

#region YearNum
        private int m_YearNum = 0;
        /// <summary>
        /// 记录etd改变计算的year值
        /// </summary>
        public int YearNum
        {
            get
            {
                return this.m_YearNum;
            }
            set
            {
                this.m_YearNum = value;
            }
        }
        #endregion
        #region GetDefaultWeek
        public int GetDefaultWeek(DateTime date)
        {
            int days = date.DayOfYear;
            int baseWeek = days / 7 + 1;
            int extradays = days % 7;
            if (extradays == 0)
            {
                baseWeek--;
                extradays += 7;
            }
            if (extradays - this.GetDayOfWeekCount(date.DayOfWeek) > 0)
            {
                baseWeek++;
            }
            if (date.Year > 2009)
            {
                int cell = this.CheckFirstDayOfYear(date);
                int lastcell=this.CheckLastDayOfYear(date);
                DateTime lastday=new DateTime (date.Year,12,31);
                int yearDays=lastday.DayOfYear;
                baseWeek = baseWeek + cell;
                if (baseWeek == 0)
                {
                    this.m_YearNum = date.Year - 1;
                    baseWeek = this.GetDefaultWeek(Convert.ToDateTime((date.Year - 1).ToString() + "-12-31"));
                }
                #region
                else if(lastcell!=0&&days>(yearDays-lastcell))
                {
                    this.m_YearNum = date.Year + 1;
                    baseWeek = this.GetDefaultWeek(Convert.ToDateTime((date.Year + 1).ToString() + "-1-1"));
                }
                #endregion
                else
                {
                    this.m_YearNum = date.Year;
                }
            }
            return baseWeek;
        }
        #endregion

        #region GetDayOfWeekCount
        public int GetDayOfWeekCount(System.DayOfWeek dayOfWeek)
        {
            if (dayOfWeek == System.DayOfWeek.Sunday) return 7;
            return (int)dayOfWeek;
        }
        #endregion

        #region CheckFirstDayOfYear
        private int CheckFirstDayOfYear(DateTime date)
        {
            int cell = 0;
            string year = date.Year.ToString();
            DateTime FirstDate = Convert.ToDateTime(year + "-01-01");
            if ((int)FirstDate.DayOfWeek > 4 || (int)FirstDate.DayOfWeek==0)
            {
                cell = -1;
            }
            return cell;
        }
        #endregion

        #region CheckLastDayOfYear
        private int CheckLastDayOfYear(DateTime date)
        {
            int cell = 0;
            string year = date.Year.ToString();
            DateTime LastDate = Convert.ToDateTime(year + "-12-31");
            if ((int)LastDate.DayOfWeek < 4 && (int)LastDate.DayOfWeek!=0)
            {
                cell = (int)LastDate.DayOfWeek;
            }
            return cell;
        }
        #endregion

 

//注解表达能力比较差 呵呵。

转载于:https://www.cnblogs.com/gf345725726/archive/2012/09/13/2682804.html

### 回答1: 计算某月某日是该的第几天可以按照以下步骤进行: 1. 先算出该是否是闰。若该能被4整除但不能被100整除,或者能被400整除,则是闰,否则不是闰。 2. 然后根据月份计算出该月前面所有月份的天数总和。例如,若要计算5月15日是该的第几天,那么先计算1月、2月、3月、4月的天数总和。 3. 最后加上该月的天数,就是该的第几天了。 举个例子,假设要计算20232月15日是该的第几天: 1. 2023不是闰。 2. 1月31日是该的第31天,2月份共有28天,所以2月15日前面所有月份的天数总和是31+28=59。 3. 再加上15天,即可得到20232月15日是该的第74天。 因此,20232月15日是该的第74天。 ### 回答2: 计算某月某日是该的第几天是一个比较基础的问题,需要具备一些计算基础知识。我们可以用程序或手算的方式进行计算计算方法: 1. 首先,我们需要知道该是否为闰。闰的判断方法是,如果该能被4整除但不能被100整除,或者能被400整除,那么该就为闰。 2. 接着,我们需要计算该月之前的天数总和。例如,如果要计算20223月15日是该的第几天,那么我们需要先计算1月1日到2月28日(或29日)的天数总和,再加上3月1日到3月15日的天数。 3. 最后,我们将之前的天数总和与该日的天数相加,即得到该日期是该的第几天。 下面是一个简单的Python程序示例: ``` def is_leap(year): """判断是否为闰""" return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) def day_of_year(year, month, day): """计算某天是该的第几天""" days_in_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if is_leap(year): days_in_month[2] = 29 total_days = 0 for i in range(1, month): total_days += days_in_month[i] total_days += day return total_days print(day_of_year(2022, 3, 15)) # 输出:74 ``` 在程序,我们首先定义了一个函数`is_leap`来判断是否为闰,然后定义了函数`day_of_year`来计算某天是该的第几天。在`day_of_year`函数,我们先定义了一个列表`days_in_month`,其存储每个月的天数,如果该为闰,我们需要将2月的天数修改为29天。接着,我们遍历1月到该月之前的天数,将天数总和计算出来,最后加上该日的天数,即可得到结果。 ### 回答3: 计算某月某日是该的第几天,需要根据日期的、月、日先获得当天的日期,并使用天数累加的方式得到该日期是该的第几天。具体步骤如下: 1. 首先判断该是否为闰,如果该为闰,则2月份有29天,否则为28天。 2. 根据月份确定该月份的天数,然后把前面月份的天数累加起来。 3. 再加上当月的天数即可得到该日期是该的第几天。 下面是具体实现代码: ```python # 判断是否为闰 def is_leap_year(year): return year % 4 == 0 and year % 100 != 0 or year % 400 == 0 # 获取某月的天数 def get_days(year, month): if month in [1, 3, 5, 7, 8, 10, 12]: return 31 elif month in [4, 6, 9, 11]: return 30 elif month == 2: if is_leap_year(year): return 29 else: return 28 # 计算某月某日是该的第几天 def get_day_of_year(year, month, day): days = 0 for i in range(1, month): days += get_days(year, i) days += day return days # 测试代码 print(get_day_of_year(2022, 7, 7)) # 输出结果为188 ``` 以上代码,`is_leap_year`用来判断是否为闰,`get_days`用来获取某月的天数,`get_day_of_year`是主要的函数,用来计算某月某日是该的第几天。最后,我们调用`get_day_of_year(2022, 7, 7)`,输出结果为188。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值