zoukankan      html  css  js  c++  java
  • 計算某天屬於當月的第幾週的簡單方法(最終版)

    using System;

    using System.Collections.Generic;

    using System.Text;


    namespace PMSLib.Utils {

        public sealed class SpecialDateTime {

            private int _year, _month, _day;

            private int _week;

            private int _maxDays;


            public SpecialDateTime(int year, int month, int day) {

                _year = year;

                _month = month;

                _day = day;


                _maxDays = DateTime.DaysInMonth(year, month);

            }

            public SpecialDateTime(int year, int month) {

                _year = year;

                _month = month;

                _day = 1;


                _maxDays = DateTime.DaysInMonth(year, month);

            }

            public SpecialDateTime() { }


            public int Removal {

                get {

                    int removal = 7 - (int)(new DateTime(_year, _month, 1).DayOfWeek);

                    return removal == 7 ? 0 : removal;

                }

            }

            public int Markup {

                get {

                    return (6 - (int)(new DateTime(_year, _month, _maxDays).DayOfWeek));

                }

            }


            public int WeeksInMonth {

                get {

                    return (_maxDays + Markup - Removal) / 7;

                }

            }

            public int DaysInMonth {

                get { return (EndDateOfMonth - StartDateOfMonth).Days + 1; }

            }

            public DateTime StartDateOfMonth {

                get { return new DateTime(_year, _month, 1).AddDays(Removal); }

            }

            public DateTime EndDateOfMonth {

                get { return new DateTime(_year, _month, _maxDays).AddDays(Markup); }

            }


            public void GetWeekInMonthBy(int year, int month, int day, out int realMonth, out int week) {

                int removal = 7 - (int)(new DateTime(year, month, 1).DayOfWeek);

                removal = removal == 7 ? 0 : removal;


                TimeSpan ts = new DateTime(year, month, day) - new DateTime(year, month, 1).AddDays(removal);

                if(ts.Days < 0) {

                    realMonth = month - 1;

                    removal = 7 - (int)(new DateTime(year, realMonth, 1).DayOfWeek);

                    removal = removal == 7 ? 0 : removal;


                    TimeSpan ts1 = new DateTime(year, month, day) - new DateTime(year, realMonth, 1).AddDays(removal);

                    week = (int)Math.Ceiling(ts1.Days == 0 ? 1 : (ts1.Days) * 1.0 / 7);

                } else {

                    realMonth = month;

                    week = (int)Math.Ceiling(ts.Days == 0 ? 1 : ts.Days * 1.0 / 7);


                    if(ts.Days != 0 && ts.Days % 7 == 0) {

                        week = week + 1;

                    }

                }

            }

            public DateTime GetDateBy(int year, int month, int weekInMonth, DayOfWeek dayOfWeek) {

                if(month > 12) {

                    year += month / 12;

                    month = month % 12;

                }

                int removal = 7 - (int)(new DateTime(year, month, 1).DayOfWeek);

                removal = removal == 7 ? 0 : removal;


                DateTime startDate = new DateTime(year, month, 1).AddDays(removal);

                return startDate.AddDays((weekInMonth - 1) * 7 + (int)dayOfWeek);

            }

            public void GetDateRangeInWeek(int year, int month, int week, out DateTime startDate, out DateTime endDate) {

                startDate = (new DateTime(year, month, 1).AddDays(Removal).AddDays((week - 1) * 7));

                endDate = (new DateTime(year, month, 1).AddDays(Removal).AddDays((week - 1) * 7 + 6));

            }


            public IList<DateTime> GetDatesBy(int minWeekInMonth, DayOfWeek dow, int interval) {

                IList<DateTime> dates = new List<DateTime>();


                while(GetDateBy(_year, _month, minWeekInMonth, dow) <= EndDateOfMonth) {

                    dates.Add(GetDateBy(_year, _month, minWeekInMonth, dow));

                    minWeekInMonth += interval;

                }


                return dates;

            }


            public IList<DateTime> GetDatesBy(DateTime date, int interval, string unit, int realMonth) {

                IList<DateTime> dates = new List<DateTime>();


                SpecialDateTime sdt = new SpecialDateTime(date.Year, realMonth);

                if(unit.Equals("W")) {

                    do {

                        DateTime d = date.AddDays(7 * interval);

                        if(sdt.StartDateOfMonth > d || d > sdt.EndDateOfMonth) break;


                        dates.Add(d);

                        date = d;

                    } while(sdt.StartDateOfMonth <= date && date <= sdt.EndDateOfMonth);

                } else {

                    int week, month;

                    sdt.GetWeekInMonthBy(date.Year, date.Month, date.Day, out month, out week);


                    DateTime d = sdt.GetDateBy(date.Year, month + interval, week, date.DayOfWeek);

                    if(realMonth == month + interval) {

                        dates.Add(d);

                    }

                }


                return dates;

            }

        }

    }


  • 相关阅读:
    面向对象进阶
    EasyDSS转码模块关于gRPC服务注册到ETCD的实现过程
    如何通过ETCD实现EasyDSS分布式负载均衡?ETCD部署方案
    EasyDSS_dash版本如何在新内核下实现rtsp源地址的分发?
    EasyDSS因为系统时间导致的闪退分析及处理
    EasyScreenLive推流组件推RTSP流到EasyDSS操作过程分享
    【解决方案】无人机+EasyDSS实现直播推流警务安防类行业应用
    EasyDSS转码服务负载均衡采用grpc balance回报找不到结构体问题排查及修复
    EasyDSS视频直播时直播间接口和实际接口为什么会存在差异?
    在线课堂EasyDSS_dash版本虚拟直播RTSP播放无视频流问题
  • 原文地址:https://www.cnblogs.com/Koy/p/1797508.html
Copyright © 2011-2022 走看看