2

単純な日付の問題のように見えますが、効率的に取得しようとして頭を悩ませることはできません... 基本的に、特定の日の前月の日付を取得する必要があります。

: 今日がその月の第 3 木曜日の場合、先月の第 3 木曜日の日付を取得します。その日の数に基づいていることが重要です...つまり、最初の月曜日、4 番目の金曜日、2 番目の水曜日などです。

これを行うための最良の方法は何ですか?

ところで...相当する前月日がない場合は問題ありません。私はそれを扱うことができます。また、現在、これを把握するために、数または日数 (「月曜日」、「火曜日」など) を手動で数えています。もっとエレガントな方法があることを願っていました。

4

5 に答える 5

1

これが私がすることです:

static DateTime? GetLastMonthSameNthDayOfWeek(DateTime date)
{
    int nth = (date.Day-1) / 7; // returns 0 if 1st, 1 if 2nd...
    var prevMonthDay = date.AddMonths(-1);

    // find the first date of month having the same day of week
    var d = new DateTime(prevMonthDay.Year, prevMonthDay.Month, 1);
    while(d.Day <= 7)
    {
        if (d.DayOfWeek == date.DayOfWeek)
            break;
        d = d.AddDays(1);
    }
    // go to nth day of week
    d = d.AddDays(7 * nth);
    // if we have passed the current month, there's no nth day of week
    if (d.Month != prevMonthDay.Month)
        return null;
    return d;
}

使用例:

// 3rd wednesday of August 2012
var a = new DateTime(2012, 8, 15);
var aPrev = GetLastMonthSameNthDayOfWeek(a);
// aPrev = July 18th 2012 (i.e. the 3rd wednesday of July 2012)

// 5th wednesday of August 2012
var b = new DateTime(2012, 8, 15);
var bPrev = GetLastMonthSameNthDayOfWeek(b);
// bPrev = null, because there's no 5th wednesday of July 2012

注意:

月内の曜日の序数位置を取得するのは本当に簡単です。

int nth = ((date.Day-1) / 7) + 1; // 1 -> 1st, 2 -> 2nd, 3 -> 3rd ...
于 2012-08-06T16:55:33.710 に答える
1

組み込みの方法が見つからなかったので、この単純な拡張メソッドを 用DateTimeに作成しました。確認してください。

public static class DateTimeExtension
{
    public static DateTime GetPositionalDate(this DateTime BaseDate, DayOfWeek WeekDay, int position)
    {
        if (position < 1)
        {
            throw new Exception("Invalid position");
        }
        else
        {
            DateTime ReturnDate = new DateTime(BaseDate.Year, BaseDate.Month, BaseDate.Day);
            int PositionControl = 1;
            bool FoundDate = false;

            while(ReturnDate.DayOfWeek != WeekDay)
            {
                ReturnDate = ReturnDate.AddDays(1);
            }

            while (!FoundDate && PositionControl <= position)
            {
                PositionControl++;

                if (PositionControl == position)
                {
                    FoundDate = true;
                }
                else
                {
                    ReturnDate = ReturnDate.AddDays(7);
                }
            }

            if (FoundDate)
            {
                return ReturnDate;
            }
            else
            {
                throw new Exception("Date not found");
            }
        }
    }
}

使用法:

DateTime lastMonth = DateTime.Now.GetPositionalDate(DayOfWeek.Sunday, 2);

よろしく

于 2012-08-06T17:06:07.987 に答える
0

デフォルトでは、.Net が日付のこの特定のロジックを理解する方法はありません。したがって、次を使用して、探しているものを取得できます。

var now = DateTime.Now.Date;

DateTime.AddMonth(-1) を使用して last month を取得します

DateTime.AddDays(now.Days * -1 + 1) を使用して月の初日を取得します。

DateTime.DayOfWeek を使用して日を決定し、必要に応じて日を減算または加算します

于 2012-08-06T17:04:39.103 に答える
0

これが私が思いついた解決策です。その日が存在しない場合 (例: 第 8 土曜日)、GetDate() は null を返します。

{
    DateTime lastMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1);
    DateTime? date = GetDate(lastMonth.Month, lastMonth.Year, DayOfWeek.Thursday, 2);
}

private static DateTime? GetDate(int month, int year, DayOfWeek dayOfWeek, int which)
{
    DateTime firstOfMonth = new DateTime(year, month, 1);

    DateTime date;
    for (date = firstOfMonth; date.DayOfWeek != dayOfWeek; date = date.AddDays(1))
        ;

    date = date.AddDays(7 * (which - 1));

    return date.Month == month && date.Year == year ? (DateTime?)date : null;
}
于 2012-08-06T17:31:33.597 に答える
0

さて、あなたができることは、先月の月の最初の日の曜日を決定し、必要な曜日とその曜日の差を取り、7 * 必要な週を追加することです ( 1週間弱)…

// Let's get the 3rd Friday of last month:

// get starting date
DateTime date = new DateTime();

// get first day of last month
DateTime firstOfLastMonth = date.AddMonths(-1).AddDays(-1 * (date.Day + 1));

// subtract out the day of the week (get the previous Sunday, even if it is last month)
DateTime justBeforeMonth = firstOfLastMonth.AddDays((int)firstOfLastMonth.DayOfWeek);

// Add in the DayOfWeek number we are looking for
DateTime firstFridayOfMonth = justBeforeMonth.AddDays(DayOfWeek.Friday);

// if we are still in last month, add a week to get into this month
if (firstFridayOfMonth.Month != date.AddMonth(-1).Month) { firstFridayOfMonth.AddDays(7); }

// add in 2 weeks to get the third week of the month
DateTime thirdFridayOfMonth = firstFridayOfMonth.AddDays(14);
于 2012-08-06T17:08:51.253 に答える