【问题标题】:How to get set of dates in a specific week ,given the month and the year?给定月份和年份,如何获取特定周内的一组日期?
【发布时间】:2013-06-12 04:46:12
【问题描述】:

如何在给定月份和年份的特定周内获得dates

例如:

我的参数:

June - 2013  - The second week 

我想要这样的结果集:

9-6-2013
10-6-2013
11-6-2013
12-6-2013
13-6-2013

我希望从周日到周四。

【问题讨论】:

  • 你如何定义“周”?总是从 8 号开始?总是从星期六开始? ISO 术语中的一周中的一周?
  • 我希望它从周日到周三开始,在我的例子中是第二周
  • 那么您在编写代码时究竟遇到了什么问题?弄清楚一周中的哪一天是任何特定的日子?查找给定月份的第一天?增加天数直到找到满足您标准的第一天?数到 7?
  • 我写了方法,但我认为它是针对我的情况的,我想要一些通用的方法
  • 您说您希望 Sun to Wed 但您的示例显示 Sun to Thu?

标签: c# asp.net date datetime


【解决方案1】:

在我的 Noda Time 库中,我会:

  • 从上个月月底开始
  • 循环多次,找到下一个星期日
  • 从那里开始,产生天数(这样您就可以使用 foreach 循环):

所以:

IEnumerable<LocalDate> GetSundayToWednesday(int year, int month, int week)
{
    LocalDate date = new LocalDate(year, month, 1).PlusDays(-1);        
    for (int i = 0; i < week; i++)
    {
        date = date.Next(IsoDayOfWeek.Sunday);
    }
    // You always want 4 days, Sunday to Wednesday
    for (int i = 0; i < 4; i++)
    {
        yield return date;
        date = date.PlusDays(1);
    }
}

仅使用 DateTime,我可能会从该月的第一天开始,可能是(周 * 7 + 1)并循环,直到我找到正确的星期几,然后从那里去:

IEnumerable<DateTime> GetSundayToWednesday(int year, int month, int week)
{
    // Consider breaking this part out into a separate method?
    DateTime date = new DateTime(year, month, week * 7 + 1);
    for (int i = 0; i < 7; i++)
    {
        if (date.DayOfWeek == DayOfWeek.Sunday)
        {
            break;
        }
        date = date.AddDays(1);
    }
    // You always want 4 days, Sunday to Wednesday
    for (int i = 0; i < 4; i++)
    {
        yield return date;
        date = date.AddDays(1);
    }
}

这样的循环效率并不高——你可以算出提前多少天——但更明显的是正确。通过更有效的方法,您可以很容易地以一个错误(或回到上个月)结束。当然,如果这很重要,您可以选择更加努力提高效率。

【讨论】:

  • 我正想说 StackOverflow 先生在 Noda Time 工作,他会推荐它! :-)
【解决方案2】:

我还没有真正测试过这个,但我认为这或多或少是你想要的:

        int year = 2013;
        int month = 6;
        int lookupWeek = 2;

        int daysInMonth = DateTime.DaysInMonth(year, month);
        int weekCounter = 1;

        List<DateTime> weekDays = new List<DateTime>();

        for (int day = 1; day <= daysInMonth; day++)
        {
            DateTime date = new DateTime(year,month,day);
            if(date.DayOfWeek == DayOfWeek.Sunday && day > 1) weekCounter++;

            if(weekCounter == lookupWeek) weekDays.Add(date);
        }

【讨论】:

  • 用更清晰的变量名称更新了几次,并修复了周编号。
【解决方案3】:

如果您对客户端 (JavaScript) 路由感兴趣,那么 date.js 可能值得一看,它允许以下内容:

// What date is next thursday?
Date.today().next().thursday();

// Add 3 days to Today
Date.today().add(3).days();

// Is today Friday?
Date.today().is().friday();

// Number fun
(3).days().ago();

// 6 months from now
var n = 6;
n.months().fromNow();

// Set to 8:30 AM on the 15th day of the month
Date.today().set({ day: 15, hour: 8, minute: 30 });

// Convert text into Date
Date.parse('today');
Date.parse('t + 5 d'); // today + 5 days
Date.parse('next thursday');
Date.parse('February 20th 1973');
Date.parse('Thu, 1 July 2004 22:30:00');

我发现自然语言语法(即“下周四”)非常强大。

【讨论】:

    【解决方案4】:

    此方法给出一个月中特定星期的天数:

    static IEnumerable<string> DaysInWeek(int year, int month, int week)
    {
        var date = new DateTime(year, month, 1);
    
        var calendar = new GregorianCalendar();
        var firstWeek = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);
        var days = calendar.GetDaysInMonth(year, month);
    
        var daysInWeek = (from day in Enumerable.Range(0, calendar.GetDaysInMonth(year, month) - 1)
                            let dayDate = date.AddDays(day)
                            let week2 = calendar.GetWeekOfYear(dayDate, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday) - firstWeek + 1
                            where week2 == week
                            select day + 1).ToList();
    
        foreach (var d in daysInWeek) yield return string.Format("{0:00}-{1:00}-{2:0000}", d, month, year);
    }
    

    这个的输出:

    foreach (var d in DaysInWeek(week, year, month).Take(5)) Log.Info(d);
    

    应该是:

    09-06-2013
    10-06-2013
    11-06-2013
    12-06-2013
    13-06-2013
    

    注意:我已经编辑了代码。有一个小错误;因为在许多个月中,第一周和最后一周不是完整的周,并且该周的某些天属于另一个月。

    【讨论】:

      【解决方案5】:

      如果您热衷于使用 linq(我几乎总是如此!),您可以这样做:

      int year = 2013;
      int month = 6;
      int weekOfMonth = 2;
      
      var dates = Enumerable.Range(1, DateTime.DaysInMonth(year, month))
                          .Select(day => new DateTime(year, month, day))
                          .GroupBy(g=> g.DayOfYear/7)
                          .ToList();
      
      var week = dates.Min(g => g.Key) + weekOfMonth - 1;
      var result = dates.Where(g=> g.Key.Equals(week)).Select(g => g.ToList());
      

      【讨论】:

        【解决方案6】:

        试试这个

        protected void button_click(object sender, EventArgs e)
          {
                DateTime dt = new DateTime(2013, 6, 1);
                string[] dates = getDates(dt);
        
           }
                public string[] getDates(DateTime dt)
            {
                string[] result = new string[7]; ;
                for (int i = getDay(dt.DayOfWeek.ToString()); i < 7; i++)
                {
                    if (i == 0)
                    {
                        break;
                    }
                    else
                    {
                        dt = dt.AddDays(1);
                    }
                }
                for (int i = 0; i < 7; i++)
                {
                    dt = dt.AddDays(1);
                    result[i] = dt.ToShortDateString();
                }
                return result;
            }
            public int getDay(string day)
            {
                switch (day)
                {
                    case "Monday":
                        return 0;
                    case "Tuesday":
                        return 1;
                    case "Wednesday":
                        return 2;
                    case "Thursday":
                        return 3;
                    case "Friday":
                        return 4;
                    case "Saturday":
                        return 5;
                    case "Sunday":
                        return 6;
                    default:
                        return 0;
                }
            }## Heading ##
        

        【讨论】:

        • -1:没有 any cmets 的“试试这个”不是 SO 答案的好格式。
        猜你喜欢
        • 2017-01-19
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2021-05-11
        • 2017-12-04
        相关资源
        最近更新 更多