【问题标题】:calulate month from week no从第几周开始计算月份
【发布时间】:2011-05-10 09:50:06
【问题描述】:

我从数据库中得到星期数,需要计算它是一个月中的哪一周。

例如:

week no = 7 month = 2

week no 11 month = 3

如何计算??

只是补充一下,我也有带有周数的年份值。

【问题讨论】:

  • 如果一周跨越两个月怎么办?
  • 但是如果一周在两个月之间呢?
  • @Øyvind Knobloch-Bråthen 值得注意的任务
  • 这很棘手。你也需要知道年份。还有几种方法可以确定第一周是什么(4 天或更长时间,第一个星期日,第一个完整的工作周)
  • @Marco 如果一周在两个月之间,我只需要属于一周开始日期的月份

标签: c# asp.net culture


【解决方案1】:

好的,我试试看,但不是很漂亮:

public int MonthOfWeek( int week, int year, CalendarWeekRule, weekrule, DayOfWeek firstDayOfWeek)
{
  GregorianCalendar gc = new GregorianCalendar();
  for( DateTime dt = new DateTime(year, 1, 1); dt.Year == year; dt = dt.AddDays(1))
  {
    if( gc.GetWeekOfYear( dt, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) == week ){
      return dt.Month;
    }
  }
  return -1;
}  

这考虑了生成周的文化特定规则。如果将一周分为两个月,它将返回遇到的第一个月。

所以在挪威,我会用CalendarWeekRule.FirstFourDayWeekDayOfWeek.Monday 调用它以获得正确的结果。

【讨论】:

    【解决方案2】:

    根据周数计算日期:

    Calculate date from week number

    获取 WeekOfMonth:

    Calculate week of month in .NET

    【讨论】:

      【解决方案3】:

      假设您正在查找给定年份的月份:

      var dtYearStart = new DateTime(DateTime.Now.Year, 1, 1);
      CultureInfo defaultCultureInfo = CultureInfo.CurrentCulture;
      
      // Check for the starting date of the initial week.
      int diff = dtYearStart.DayOfWeek - defaultCultureInfo.DateTimeFormat.FirstDayOfWeek;
      if (diff < 0)
      {
       diff += 7;
      }
      
      dtYearStart = dtYearStart.AddDays(-1 * diff).Date;
      
      int weekNo = 15;
      
      DateTime dtWeekBased = dtYearStart.AddDays((weekNo-1) * 7);
      string strMonth  = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(dtWeekBased.Month);
      

      【讨论】:

      • 我觉得你应该加(weekNo-1)*7,我错了吗?无论如何,+1 因为这是一个很好的答案! :)
      • 不起作用 - 一年中的第一个日历周可能从上一年的 12 月开始。
      • @Marco:我刚刚查过了,是的,应该是 weekNo-1,谢谢。我已经更新了。
      • 您不确定第一周是一年的前 7 天。这并不总是给出正确的结果。
      • @Thortsten,如果一周从前一年开始,则无关紧要,因为添加额外的周总是会将日期推到正确周索引的后续相对日期。
      【解决方案4】:

      使用 DateTime,您可以将周数乘以 7,得到一年中过去的总天数,将这些天数添加到 31/12/yyyy-1 并从生成的 DateTime 中获取月份。

      我希望这对你有用。

      再见。

      【讨论】:

      • 不起作用 - 一年中的第一个日历周可能从上一年的 12 月开始。
      • 我明白了,你必须设置然后 31/12/yyyy-1?对不起,我现在编辑一下
      • @Amedio - 周数的生成方式还取决于特定于文化的设置。不幸的是,这并不总是能提供正确的结果。
      • @Oyvind - 那么我的解决方案只能在长达 7 天的几周和长达 365/366 天的年份中正常工作?
      • @Amedio - 从 31.12.yyyy 中减去一天有什么帮助?第 1 周的第一天(在挪威)可以是从 28.12.yyyy-1 到 3.1.yyyy 的任何一天。这取决于新年的开始日期。
      【解决方案5】:

      4 周 = 1 个月 所以使用

      周%4

      它返回你没有月份

      【讨论】:

      • 4 周!= 1 个月。 4 周 = 4*7 天 = 28 天。只有二​​月才有资格获得此资格(至少在大多数年份)。这是尽可能不准确的。
      • 但他只想要一周中的一个月而不是一周中的几天
      • 首先,我猜你的意思是 week/4 (也是除法,而不是模数)。它仍然无法正常工作。一个例子:第 14 周是 4.-10。四月。然而,14/4 = 3.5 表示三月。如果您认为一月是 0 而不是 1,那么它在第 14 周是正确的,因为 3 是四月,但是对于例如第 51 周(19.-25.十二月),您将得到 51/4 = 12.75 表示该周51 属于一年中的第 13 个月。没有多大意义。由于一个月不是 4 周,因此您不能简单地除以 4 来得到正确的结果。
      【解决方案6】:

      这里使用Time Period Library for .NET的解决方案:

      // ----------------------------------------------------------------------
      public int GetMonthOfWeek( int weekOfYear )
      {
        return new Week( weekOfYear ).FirstDayStart.Month;
      } // GetMonthOfWeek
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        相关资源
        最近更新 更多