私はスケジューラを作成しており、C# で次のことができるようにする必要があります。
- 2012 年 6 月の第 1 火曜日を求める
- 2008 年 3 月の最終金曜日を求める
- 2013 年 1 月の毎週土曜日を検索
- 2009 年 7 月の第 3 金曜日を求める
- 今後 3 か月間の毎週土曜日を検索
- 2018 年 3 月の毎日を検索
結果はDateTime
またはとして返されList<DateTime>
ます。
この質問に触発されて、日付をシーケンスとして扱い、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() です。
このプロジェクトはかなりベアボーンであり、コメントや単体テストはありませんが、これが引き続き役立つことを願っています. そうでない場合でも、とにかく書くのは楽しかったです:)
YO YO YO - あなたたちはこれを難しくしすぎています:
int DaysinMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
これは、月の最初の日を行う方法の例です。
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);
だからあなたはアイデアを得る。達成したいことを得るには、さまざまな機能を実行する必要があります。
スケジューラを作成したとき、SQL Server の sysschedules テーブルをほとんどコピーしました
http://msdn.microsoft.com/en-us/library/ms178644.aspx
Frequency Type、Frequency Intervalなどを使用すると、コードで値を簡単に計算できますが、それを行うためのsprocがあると思います。私は今それを探しています。
はい、.NET Framework
問題なくサポートされます ;)
しかし真剣に、それを行うコードをかなり簡単に書けるはずです。そうでない場合は、行き詰まったときに質問してください。ただし、外部アセンブリは必要ありません。標準の C# クラスを使用するだけです =)