4

私はスケジューラを作成しており、C# で次のことができるようにする必要があります。

  1. 2012 年 6 月の第 1 火曜日を求める
  2. 2008 年 3 月の最終金曜日を求める
  3. 2013 年 1 月の毎週土曜日を検索
  4. 2009 年 7 月の第 3 金曜日を求める
  5. 今後 3 か月間の毎週土曜日を検索
  6. 2018 年 3 月の毎日を検索

結果はDateTimeまたはとして返されList<DateTime>ます。

4

6 に答える 6

2

この質問に触発されて、日付をシーケンスとして扱い、LINQ でクエリできるようにするのは楽しいことのように思えました。GitHub からダウンロードできる簡単なプロジェクトを作成しました私がそれに取り組んでいるとは思えないので、ソース管理に追加する必要があるかどうかはわかりませんが、どこかにアップロードする必要があり、RapidShare にアップロードするのは少し危険に思えました :)

私の「Linq-to-DateTime」で解決した最初の質問:

  /*
   *    1. Find the 1st Tuesday of June 2012
        2. Find the last Friday of March 2008
        3. Find every Saturday in January 2013
        4. Find the 3rd Friday in July 2009
        5. Find every Saturday over the next 3 months
        6. Find every day in March 2018
  */

  var firstTuesday = (from d in DateSequence.FromYear(2012).June()
                    where d.DayOfWeek == DayOfWeek.Tuesday
                    select d).First();

  var lastFriday = (from d in DateSequence.FromYear(2008).March()
                    where d.DayOfWeek == DayOfWeek.Friday
                    select d).Last();

  var saturdays = (from d in DateSequence.FromYear(2013).January()
                   where d.DayOfWeek == DayOfWeek.Saturday
                   select d);

  var thirdFriday = (from d in DateSequence.FromYear(2009).July()
                     where d.DayOfWeek == DayOfWeek.Friday
                     select d).Skip(2).First();

  var nextSaturdays = (from d in DateSequence.FromDates(DateTime.Today, DateTime.Today.AddMonths(3))
                       where d.DayOfWeek == DayOfWeek.Saturday
                       select d);

  var allDays = (from d in DateSequence.FromYear(2018).March()
                 select d);

この例では、クエリの粒度を選択できることは示されていません。つまり、これを行うと:

  var days = (from d in DateSequence.FromYears(2001, 2090).AsYears()
              where d.Year % 2 == 0
              select d.Year).ToList();

年単位で日付を繰り返します。何も指定しない場合、デフォルトは AsDays() です。

このプロジェクトはかなりベアボーンであり、コメントや単体テストはありませんが、これが引き続き役立つことを願っています. そうでない場合でも、とにかく書くのは楽しかったです:)

于 2009-10-03T13:13:50.240 に答える
1

YO YO YO - あなたたちはこれを難しくしすぎています:

int DaysinMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);

于 2013-07-31T00:26:59.150 に答える
1

これは、月の最初の日を行う方法の例です。

public enum Month
{
    January = 1,
    Febuary = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}

public static Nullable<DateTime> FindTheFirstDayOfAMonth(DayOfWeek dayOfWeek, Month month, int year)
{
    // Do checking of parameters here, i.e. year being in future not past

    // Create a DateTime object the first day of that month
    DateTime currentDate = new DateTime(year, (int)month, 1);

    while (currentDate.Month == (int)month)
    {
        if (currentDate.DayOfWeek == dayOfWeek)
        {
            return currentDate;
        }

        currentDate = currentDate.AddDays(1);
    }

    return null;
}

あなたはそれを次のように呼びます

Nullable<DateTime> date = Program.FindTheFirstDayOfAMonth(DayOfWeek.Monday, Month.September, 2009);

だからあなたはアイデアを得る。達成したいことを得るには、さまざまな機能を実行する必要があります。

于 2009-10-01T20:59:07.097 に答える
0

スケジューラを作成したとき、SQL Server の sysschedules テーブルをほとんどコピーしました

http://msdn.microsoft.com/en-us/library/ms178644.aspx

Frequency Type、Frequency Intervalなどを使用すると、コードで値を簡単に計算できますが、それを行うためのsprocがあると思います。私は今それを探しています。

于 2009-10-01T21:02:26.230 に答える
-2

はい、.NET Framework問題なくサポートされます ;)

しかし真剣に、それを行うコードをかなり簡単に書けるはずです。そうでない場合は、行き詰まったときに質問してください。ただし、外部アセンブリは必要ありません。標準の C# クラスを使用するだけです =)

于 2009-10-01T20:52:59.853 に答える