【问题标题】:ASP.NET Getting working weeks for every monthASP.NET 获得每个月的工作周数
【发布时间】:2013-01-17 16:18:58
【问题描述】:

我有一个接受“月”和“年”输入的表格,我在这里写信是想询问我将如何获得所有“工作周”的任何想法?

我的意思是周一至周五的“工作周”

所以基本上我需要第 1 周到第 4 周,或者如果有的话,包括第 5 周。

例如,如果我输入 2013 年 1 月:

week1 = January 1 to January 4
week2 = January 7 to January 11
week3 = January 14 to January 18
week4 = January 21 to January 25
week5 = January 28 to January 31

我怎样才能做到这一点?谢谢你的帮助!任何建议或想法将不胜感激。谢谢小伙伴们! :)

【问题讨论】:

  • 您使用的是哪个版本的 .net?
  • 我使用.net 2.0,因为我创建了一个将上传到sharepoint的单个页面,并且sharepoint仅支持2.0 :(
  • 那么如果有人输入了月份和年份,然后用户得到了该月份所有标准工作日的输出,会发生什么?
  • 不,在用户输入月份和年份后,我需要得到 week1-week5,所以我可以将它与我的 select 命令一起使用,并使用我的 sql 查询。

标签: c# asp.net date .net-2.0


【解决方案1】:

你可以使用这个 Linq 查询:

int month = 1;
int year = 2013;
var cal = System.Globalization.CultureInfo.CurrentCulture.Calendar;
IEnumerable<int> daysInMonth = Enumerable.Range(1, cal.GetDaysInMonth(year, month));

List<Tuple<int, DateTime, DateTime>> listOfWorkWeeks = daysInMonth
    .Select(day => new DateTime(year, month, day))
    .GroupBy(d => cal.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
    .Select(g => Tuple.Create(g.Key, g.First(), g.Last(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)))
    .ToList();

// Item1 = week in year, Item2 = first day, Item3 = last working day
int weekNum = 1;
foreach (var weekGroup in listOfWorkWeeks)
{
    Console.WriteLine("Week{0} = {1} {2} to {1} {3}"
        , weekNum++
        , System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(month)
        , weekGroup.Item2.Day
        , weekGroup.Item3.Day);
}

一月份的输出:

Week1 = January 1 to January 4
Week2 = January 7 to January 11
Week3 = January 14 to January 18
Week4 = January 21 to January 25
Week5 = January 28 to January 31

二月:

Week1 = February 1 to February 1
Week2 = February 4 to February 8
Week3 = February 11 to February 15
Week4 = February 18 to February 22
Week5 = February 25 to February 28

【讨论】:

  • 当前内容中不存在名称“CalendarWeekRule”。 :(
  • 添加System.Globalization的使用。
  • @JRC:如果您不想使用其他变量来增加周数,您可以将Tuple.Item1(当前是年份的周数)替换为该组的 index+1 :.Select((g, i) =&gt; Tuple.Create(i+1, g.First(), g.Last(d =&gt; d.DayOfWeek != DayOfWeek.Saturday &amp;&amp; d.DayOfWeek != DayOfWeek.Sunday)))。然后您可以使用weekGroup.Item1 作为Console.WriteLine 中的第一个参数。
【解决方案2】:

查找月份和年份的第一个星期一。

int year = 2013;
int month = 1;

DateTime testDate = new DateTime(year,month,1);


while ( testDate.DayOfWeek != DayOfWeek.Monday )
{
   testDate = testDate.AddDays(1);
}

然后每周迭代,直到你到达不是 2013 年的年份。

// Should have first monday now.
// Loop until the month changes
while ( testDate.Month == month)
{
   var monday = testDate;
   var friday = testDate.AddDays(4);

   // You now have both dates.  Do whatever you need to.
   // here.

   // Increment test date by a week
   testDate = testDate.AddDays(7)
}

【讨论】:

  • 这是一个糟糕的解决方案 - 循环是疯狂的
  • @Dave Bish - 提出更好的答案。我们都是这里的科学家。我喜欢看到精致。
  • @jgauffin - 取决于用户希望如何滚动年份。 2012 年的第 52 周是 2012 年的最后一周还是 2013 年的第一周。
  • 仍在等待非循环解决方案,@DaveBish :) 目前这四/五次迭代看起来相当便宜。
【解决方案3】:

在伪代码中:

  1. 从每月的第一天开始

  2. 而(天!= 星期一)取下一个日期(+1 天)

    查看this SO post(Jon Skeet 的回答!)以检查某一天是否为星期一。

  3. 添加 4 天以找到工作周的结束

    如果是在同一个月,那么您有一个工作周的时间来回答。

  4. 添加 7 天以找到下周一

  5. 如果新的星期一仍在同一个月内:重复 3. 和 4.

EDIT以上查找所有完整个工作周。

还要查找其他周:

  • 如果该月的第一天已经是工作日,则查找下一个星期五。 -> 第一个工作周
  • 如果最后一个星期五在下个月,则在该月的最后一天完成最后一个工作周。 -> 上个工作周

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多