繁体   English   中英

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

[英]How do I get the month number from the year and week number in c#?

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

编辑:如果一周跨越两个月,我想要一周的第一天所在的月份。

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

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

我只是想反其道而行之。

如果您假设一周定义的第一天与一年中的第一天是同一天,那么这将起作用:

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

显然,一个真正的答案将取决于您如何定义一周的第一天,以及当一周重叠多个时,您如何定义一周如何落入一个月。

这就是我最终做的事情:

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;
}

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

它不也取决于星期几吗?

这应该可以提供帮助

 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;
}

假设:

  1. 星期日是一周的第一天。
  2. 部分周仍算作第 1 周
  3. 将开始和结束月份输出为 integer 数组。

     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; }

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

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

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

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

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

你不能。 一周可能从一个月开始,到另一个月结束。

我认为您假设“周”是连续 7 天的任何组。 它不是。 给定年(2008 年),周(5),您可能在 1 月或 2 月,这取决于您的“周”何时开始。

// 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM