如何从c#中获取年份和周数的月份数?

时间:2009-03-18 17:03:07

标签: c# datetime

正如标题所说,给定年份和周数,我如何获得月份数?

编辑:如果一周过了两个月,我想要一周中第一天的月份。

编辑(2):这是我获得周数的方式:

CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

我只是想反过来​​。

11 个答案:

答案 0 :(得分:9)

如果您认为您定义的一周的第一天与一年的第一天相同,那么这将有效:

int year = 2000;
int week = 9;
int month = new DateTime(year, 1, 1).AddDays(7 * (week - 1)).Month;

显然, true 答案将取决于您如何定义一周的第一天,以及如何定义一周如何重叠多个月。

答案 1 :(得分:4)

这就是我最终做的事情:

static int GetMonth(int Year, int Week)
{
    DateTime tDt = new DateTime(Year, 1, 1);

    tDt.AddDays((Week - 1) * 7);

    for (int i = 0; i <= 365; ++i)
    {
        int tWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
            tDt, 
            CalendarWeekRule.FirstDay, 
            DayOfWeek.Monday);
        if (tWeek == Week)
            return tDt.Month;

        tDt = tDt.AddDays(1);
    }
    return 0;
}

我会更喜欢更简单的东西,但它有效:)

答案 2 :(得分:2)

这不也取决于一周的哪一天吗?

答案 3 :(得分:1)

你可能面临的另一个问题是,大多数年份不是从一周开始,这会改变一切。

答案 4 :(得分:1)

这应该可以帮助

 public int getMonth(int weekNum, int year)
 {
     DateTime Current = new DateTime(year, 1, 1);
     System.DayOfWeek StartDOW = Current.DayOfWeek;
     int DayOfYear = (weekNum * 7) - 6; //1st day of the week

     if (StartDOW != System.DayOfWeek.Sunday) //means that last week of last year's month
     {
         Current = Current.AddDays(7 - (int)Current.DayOfWeek);
     }
     return Current.AddDays(DayOfYear).Month;
}

答案 5 :(得分:1)

假设:

  1. 星期天是一周的第一天。
  2. 部分周仍计为第1周
  3. 以整数数组输出开始和结束月份。

    public int[] getMonth(int weekNum, int year)
    {
    
        DateTime StartYear = new DateTime(year, 1, 1);
        System.DayOfWeek StartDOW = StartYear.DayOfWeek;
        DateTime DayOfYearWeekStart = default(DateTime);
        DateTime DayOfYearWeekEnd = default(DateTime);
        int x = 0;
        if ((StartDOW == System.DayOfWeek.Sunday)) {
            DayOfYearWeekStart = StartYear.AddDays((weekNum - 1) * 7);
            DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
        } else {
            for (x = 0; x <= 7; x += 1) {
                if (StartYear.AddDays(x).DayOfWeek == DayOfWeek.Sunday) {
                    break; // TODO: might not be correct. Was : Exit For
                }
            }
    
            if (weekNum == 1) {
                DayOfYearWeekStart = StartYear;
                DayOfYearWeekEnd = StartYear.AddDays(x - 1);
            } else if (weekNum > 1) {
                DayOfYearWeekStart = StartYear.AddDays(((weekNum - 2) * 7) + x);
                DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
            }
    
        }
    
        int[] Month = new int[2];
        Month[0] = DayOfYearWeekStart.Month;
        Month[1] = DayOfYearWeekEnd.Month;
    
        return Month;
    }
    

答案 6 :(得分:0)

你不能。您至少需要在第一周开始的那一天(或一周开始时),以获得准确的答案。

答案 7 :(得分:0)

你不能。一周可以在一个月内开始,在另一个月结束。

答案 8 :(得分:0)

我认为你假设“周”是连续7天的任何一组。事实并非如此。根据年份(2008年),第(5)周,您可以在1月或2月,具体取决于您的“周”开始时间。

答案 9 :(得分:0)

在.NET 3.0及更高版本中,您可以使用ISOWeek-Class

public static int MonthOfFirstDay(int year, int week)
{
    return ISOWeek.ToDateTime(year, week, DayOfWeek.Monday).Month;
}

请注意,年份可能不合适,因为一年的第一周可能已经在前一年的12月底开始。例如,2020年的第一周始于2019年12月30日星期一。

答案 10 :(得分:-1)

// Calculate the week number according to ISO 8601

    public static int Iso8601WeekNumber(DateTime dt)
    {
            return  CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }

// ...

DateTime dt = DateTime.Now;

// Calculate the WeekOfMonth according to ISO 8601
int weekOfMonth = Iso8601WeekNumber(dt) - Iso8601WeekNumber(dt.AddDays(1 - dt.Day)) + 1;