代码之家  ›  专栏  ›  技术社区  ›  Eddie Groves

在.NET中计算月份的周数

  •  36
  • Eddie Groves  · 技术社区  · 15 年前

    NET库是否有一种简单的方法返回给定日期的周数?例如,输入 Year = 2010, Month = 1, Day = 25 ,应输出 5 周数。

    我找到的最接近的是 Calendar.GetWeekOfYear

    Java有一个日期字符串格式“W”,它以月为单位返回周,但在.NET中我看不到任何等价的格式。

    12 回复  |  直到 15 年前
        1
  •  65
  •   jason    15 年前

    static class DateTimeExtensions {
        static GregorianCalendar _gc = new GregorianCalendar();
        public static int GetWeekOfMonth(this DateTime time) {
            DateTime first = new DateTime(time.Year, time.Month, 1);
            return time.GetWeekOfYear() - first.GetWeekOfYear() + 1;
        }
    
        static int GetWeekOfYear(this DateTime time) {
            return _gc.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
        }
    }
    

    用法:

    DateTime time = new DateTime(2010, 1, 25);
    Console.WriteLine(time.GetWeekOfMonth());
    

    输出:

    5
    

    GetWeekOfYear 根据你的需要。

        2
  •  24
  •   Community datashaman    7 年前

    没有直接的内置方法可以做到这一点,但它可以很容易地做到。以下是一种扩展方法,可用于轻松获取日期的基于年份的周数:

    public static int GetWeekNumber(this DateTime date)
    {
        return GetWeekNumber(date, CultureInfo.CurrentCulture);
    }
    
    public static int GetWeekNumber(this DateTime date, CultureInfo culture)
    {
        return culture.Calendar.GetWeekOfYear(date,
            culture.DateTimeFormat.CalendarWeekRule,
            culture.DateTimeFormat.FirstDayOfWeek);
    }
    

    然后我们可以用它来计算基于月份的周数,就像 Jason shows . 文化友好型的版本可能如下所示:

    public static int GetWeekNumberOfMonth(this DateTime date)
    {
        return GetWeekNumberOfMonth(date, CultureInfo.CurrentCulture);
    }
    
    public static int GetWeekNumberOfMonth(this DateTime date, CultureInfo culture)
    {
        return date.GetWeekNumber(culture)
             - new DateTime(date.Year, date.Month, 1).GetWeekNumber(culture)
             + 1; // Or skip +1 if you want the first week to be 0.
    }
    
        3
  •  14
  •   Jason Gilley    11 年前

    这个标题有误导性。问题其实是关于 日历周数

    对于当月的周数,您可以使用:

    VB:
        Function WeekNumber(TargetDate As Date) As Integer
            Return (TargetDate.Day - 1) \ 7 + 1
        End Function
    
    C#:
        public int WeekNumber(DateTime TargetDate)
        {
            return (TargetDate.Day - 1) / 7 + 1;
        }
    
        4
  •  4
  •   GaussZ    4 年前

    如此处所述: http://forums.asp.net/t/1268112.aspx

    您可以使用:

    public static int Iso8601WeekNumber(DateTime dt)
    {
        return  CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }
    
    public static int GetWeekOfMonth(DateTime dt)
    {    
            
        int weekOfYear = Iso8601WeekNumber(dt);
        int weekOfYearAtFirst = Iso8601WeekNumber(dt.AddDays(1 - dt.Day));
        
        if (dt.Month == 1)
        {
            //week of year == week of month in January unless
            //December wraps
            if (weekOfYearAtFirst > 6) 
            {
                return weekOfYear > 6 ? 1 : weekOfYear + 1;
            }
            else 
            {
                return weekOfYear;
            }
        }
    
        return weekOfYear - weekOfYearAtFirst + 1;
    }
    

    请注意,您的需求可能会有所不同,因为存在某些算法选择。也就是说,2月底的星期一到星期五也是3月的第一周,或者是什么标准定义了一个月的“第一”周?ISO 8601:2004没有给出“月份中的一周”的定义。

        5
  •  3
  •   Benjo    12 年前

    VB版本:

    Public Shared Function GetWeekNumber(ByVal [date] As DateTime) As Integer
        Return GetWeekNumber([date], CultureInfo.CurrentCulture)
    End Function
    
    Public Shared Function GetWeekNumber(ByVal [date] As DateTime, ByVal culture As CultureInfo) As Integer
        Return culture.Calendar.GetWeekOfYear([date], culture.DateTimeFormat.CalendarWeekRule, culture.DateTimeFormat.FirstDayOfWeek)
    End Function
    
    Public Shared Function GetWeekNumberOfMonth(ByVal [date] As DateTime) As Integer
        Return GetWeekNumberOfMonth([date], CultureInfo.CurrentCulture)
    End Function
    
    Public Shared Function GetWeekNumberOfMonth(ByVal [date] As DateTime, ByVal culture As CultureInfo) As Integer
        Return GetWeekNumber([date], culture) - GetWeekNumber(New DateTime([date].Year, [date].Month, 1), culture) + 1
        ' Or skip +1 if you want the first week to be 0.
    End Function
    
        6
  •  3
  •   Barif    10 年前

    这是我的解决方案:

        static string GetWeekNumber()
        {
    
            var weekNumber = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek,
                DayOfWeek.Sunday) -
            CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now.AddDays(1 - DateTime.Now.Day),
                CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) + 1;
    
            switch (weekNumber)
            {
                case 1 :
                    return "First";
                case 2:
                    return "Second";
                case 3:
                    return "Third";
                default:
                    return "Fourth";
            }
        }
    
        7
  •  3
  •   Glenn Ferrie    9 年前

    如果您希望将前7天视为第一周,即使该月不是从周日开始,这里有一个简单的选项:

    class Program
    {
        static void Main(string[] args)
        {
            var dates = Enumerable.Range(0, 10)
                .Select(r => new DateTime(2015, 10, 1).AddDays(r))
                .Select(q => new { Date = q, WeekOfMonth = q.WeekOfMonth() });
    
            foreach(var item in dates)
            {
                Console.WriteLine("Date: {0:ddd MM-dd-yyyy}, WOM: {1}", item.Date, item.WeekOfMonth);
            }
    
            var final = Console.ReadLine();
        }
    }
    
    public static class DateTimeExtensions
    {
        public static int WeekOfMonth(this DateTime d)
        {
            var isExact = (d.Day % 7 == 0);
            var offset = isExact ? 0 : 1;
            return (int)Math.Floor(d.Day / 7.0) + offset;
        }
    }
    
        8
  •  2
  •   pwrgreg007    12 年前

    这是一个旧线程,但我需要像这样的东西,这是我想出的。

    public static int WeekOfMonth(this DateTime date)
    {
        DateTime firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
        int firstDay = (int)firstDayOfMonth.DayOfWeek;
        if (firstDay == 0)
        {
            firstDay = 7;
        }
        double d = (firstDay + date.Day - 1) / 7.0;
        return (int)Math.Ceiling(d);
    }
    

    注意:如果您想使用星期一作为一周的第一天,则此选项应该有效。如果您希望本周从周日开始,那么在2015年3月的第2周以及其他日期都会失败。2015年3月9日星期一是第二周的第一天。上述计算结果返回该日期的“3”。

        9
  •  2
  •   cazavientos    11 年前

    一旦你有了一个月的第一天的DayOfWeek,你就可以使用整数运算得到一个月的一周。

    static class DateTimeExtensions
    {
        // Assumes that in current culture week starts on Sunday
        public static int GetWeekOfMonth(this DateTimeOffset time)
        {
            DateTimeOffset first = new DateTimeOffset(time.Year, time.Month, 1, 0, 0, 0, time.Offset);
            int firstSunday = (7 - (int)first.DayOfWeek) % 7 + 1;
            int weekOfMonth = 1 + (time.Day + 7 - firstSunday) / 7;
    
            return weekOfMonth;
        }
    }
    
        10
  •  1
  •   akjoshi HCP    12 年前
    public int WeekCalc(DateTime dt)
    {
        CultureInfo ciCurr = CultureInfo.CurrentCulture;
        int weekNum = ciCurr.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        return weekNum;
    }
    
        11
  •  1
  •   Martin    11 年前

    private int WeeksNumber()
            {
                int daysInMonth = DateTime.DaysInMonth(YourYear, YourMonth);
                DateTime date = new DateTime(Year, Month, 1);
                switch (daysInMonth)
                {
                    case 28:
                        {
                            if (date.DayOfWeek == DayOfWeek.Monday)
                            {
                                return 4;
                            }
                            else
                            {
                                return 5;
                            }
                        }
                    case 29:
                        {
                            return 5;
                        }
                    case 30:
                        {
                            if (date.DayOfWeek == DayOfWeek.Sunday)
                            {
                                return 6;
                            }
                            else
                            {
                                return 5;
                            }
                        }
                    case 31:
                        {
                            if (date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday)
                            {
                                return 6;
                            }
                            else
                            {
                                return 5;
                            }
                        }
                    default: return 5;
                }
            } 
    
        12
  •  1
  •   Nazeer Bangara    8 年前
      Dim mdt As Date = txtDT.Text
        Dim weekNum As Integer = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(mdt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) - CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(GetFirstDayOfMonth(mdt), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) + 1
        Response.Write(weekNum)
    
        13
  •  1
  •   Morgs    4 年前

    为什么不像这个扩展那么简单?

    public static int WeekNumber( this DateTime d )
    {
        int w = 0;
    
        if ( d.Day <= 7 )
        {
            w = 1;
        }
        else if ( d.Day > 7 && d.Day <= 14 )
        {
            w = 2;
        }
        else if ( d.Day > 14 && d.Day <= 21 )
        {
            w = 3;
        }
        else if ( d.Day > 21 && d.Day <= 28 )
        {
            w = 4;
        }
        else if ( d.Day > 28 )
        {
            w = 5;
        }
    
        return w;
    }