0

dates月と年を指定して特定の週に The を取得する方法は?

例えば:

私のパラメータ:

June - 2013  - The second week 

次のような結果セットが必要です。

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

日曜から木曜までお願いします。

4

6 に答える 6

8

私の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);
    }
}

just を使用すると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);
    }
}

このようなループは非常に効率的ではありません - 何日進めるかを計算することもできます - しかし、それはより明らかに正しいです。より効率的なアプローチを使用すると、非常に簡単に 1 つずれてエラーが発生する (または前月に戻る) 可能性があります。もちろん、これが重要な場合は、効率化にもっと力を入れることを選択できます。

于 2013-06-12T05:07:23.667 に答える
1

このメソッドは、月の特定の週の日を返します。

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

注:コードを編集しました。小さなバグがありました。多くの月では、最初の週と最後の週が完全な週ではなく、その週の一部の日が別の月に属しているためです。

于 2013-06-12T05:14:37.300 に答える
1

クライアント側 (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');

自然言語の構文 (「次の木曜日」など) は非常に強力だと思います。

于 2013-06-12T05:15:13.753 に答える
1

私はこれを実際にテストしていませんが、多かれ少なかれあなたが望むことをすると思います:

        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);
        }
于 2013-06-12T04:58:37.093 に答える
1

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());
于 2013-06-12T05:32:36.993 に答える
0

これを試して

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 ##
于 2013-06-12T05:19:13.787 に答える