カレンダーの休日または最もよく働く人



新年の休暇が来ています...そして、休暇について話す時間です。 休日の日付をサポートするアプリケーションを開発するとき、いくつかの疑問が生じます。そのようなデータをどのように取得し、どこで、どのように使用し、処理するのですか?





この記事では、休日に関連するリソースについて説明し、個人的な経験を人気のあるサービスやプログラムでの使用と共有したいと思います。 XtraSchedulerスケジューラーの例を使用して、これらのサービスを操作するためのオプションを検討します。 そして、記事の最後に、世界のさまざまな国の休日に関する小さな統計を掲載します。





オンライン資料



太陽、月、さまざまな種類の休日を含むカレンダー、スポーツイベントのスケジュールなど、さまざまなカレンダーに関する情報と参照リソースがあります。



RuNetでは、これらのリソースの1つに「 イベントカレンダー 」( http://www.calend.ru/ )があります。ここでは、州、職業、宗教、その他の祝日に関する情報をカテゴリに分類できます。 それらはすべて、アプリケーションで使用できるiCalendar形式のicsファイルの形式で表示されます。





他の例として、 Yandexカレンダーが 提示するリソース: Apple.comMozilla.orgiCalShare.comを提供します。 また、公開されているicsファイルのコレクションも含まれています。



XtraSchedulerスケジューラはiCalendar形式からデータをインポートできるため、上記のリソースを使用できます。 これを行うには、個別のDevExpress.XtraScheduler.v10.2.iCalendarExchange.dllアセンブリのiCalendarImporterクラスを使用します。 icsファイルからダウンロードし、カレンダーオブジェクトを作成するために必要なすべての機能を実装します。



プリセットの祝日



提案されたリソースに加えて、 Yandexカレンダーには定義済みの祝日も含まれています。 日付ナビゲータおよびさまざまなビューで、それらは赤でマークされ、説明付きのヒントがあります。 ナビゲーターの日付の色がカレンダー自体の日付の色と常に一致するとは限らないにもかかわらず、稼働日の転送があることを嬉しく思います。





XtraSchedulerはコンポーネントであるため、事前定義された日付のセットを格納することは意味がありません。 これは、休日の状況が年ごとに異なり、ユーザーが行う要件が国またはユースケースによって異なるためです。 したがって、一定の休日セットを導入する代わりに、この日付セットのプロパティコレクションをユーザーに提供し、稼働日、休日、および「休業日」のリストを決定できるようにしました。

public WorkDaysCollection WorkDays { get {... } }
      
      





以下は、このコレクションの要素クラスの以下のセットで、週末のすべてのユースケースを「オーバーラップ」します。

 public abstract class WorkDay : ICloneable { public abstract bool IsWorkDay(DateTime date); } public class WeekDaysWorkDay : WorkDay { public WeekDays WeekDays {get { ...} } } public abstract class KnownDateDay : WorkDay { public string DisplayName { get { ... } set { ... } } public DateTime Date { get { ... } } } public class Holiday : KnownDateDay { public string Location { get { ...} set { ... } } } public class ExactWorkDay : KnownDateDay { }
      
      





カレンダーイベントとしての休日



このオプションは、休日ごとにカレンダーでイベントが直接作成されることを意味します。



Yandexのカレンダーに戻ります。 最初の試験では、カレンダーに休日を追加する方法を見つけられませんでしたが、ポスターやテレビ番組の近くのどこかで休日について言及することを期待していました。 しかし、icsファイルからのインポートを使用して、イベント(休日を含む)を追加する普遍的な方法を見つけました。 結果のリストは、新規または既存のカレンダーにインポートできます。



上記のリソースから国際休日のリスト( http://www.calend.ru/img/export/ical-wholeworld.ics )をインポートしようとしました。

残念ながら、Yandexは選択したカレンダーのインポートに対応できませんでした(控えめに言っても、提案されたファイルの形式は理想的ではありません)。 ただし、Yandex自体が提案するリソースからのインポートは正常に機能します。



Googleカレンダーでは、状況は少し異なります。 ファイルからのカレンダーのインポート、リンクからのインポート、別のアカウントからのインポートに加えて、別のオプションがあります。







すぐに「その他のカレンダー」のリストが表示され、「興味深いカレンダーを表示」メニュー項目を開くと(メニューの名前が興味深いものに選択されています)、スポーツ、月の満ち欠けなどを含むさまざまなカレンダーイベントのコレクションに分類されます。 そのうちの1つは、事前定義された休日のリストです(約30か国)。







必要なものを選択して[購読]をクリックするだけで、カレンダーイベントのリストが別のカレンダーとして追加されます。 これにより、その日のイベントが追加され、その結果、対応する日付が日付ナビゲーターで太字で表示されます。



ちなみに、GoogleはInternational Holidaysファイルをインポートするタスクにうまく対処しました。



icsファイルから休日をインポートする場合、XtraSchedulerは終日個別のイベントも作成します。 これはどのように使用できますか? 時間内に交差するイベントを禁止するオプションを有効にするだけで十分です。

 schedulerControl1.OptionsCustomization.AllowAppointmentConflicts = AppointmentConflictsMode.Forbidden;
      
      





この祝日には、他のイベントを作成することはできません。



デスクトップアプリケーションの休日



icsファイルに加えて、国ごとの公式の祝日リストを取得する別の方法があります。



Microsoft Officeがインストールされている場合、ソースの1つはoutlook.holファイルであり、インストールされた製品のサブフォルダーにあります。たとえば、 C:\ Program Files \ Microsoft Office \ Office12 \ 1049 \ outlook.hol "



このファイルのデータは国のセクションに分割され、数年前以降の休日を表す行の固定リストが含まれています。



 ... [] 84  ,2006/1/1  ,2007/1/1  ,2008/1/1  ,2009/1/1  ,2010/1/1  ,2011/1/1  ,2012/1/1 ...
      
      





2010年のオフィスバージョンでは、2009年から2028年までの休日に関するデータが表示されます...



このデータはOutlookカレンダーで使用されます。 カレンダー設定では、指定した国の休日を追加できます。 同時に、休日も物理的なカレンダーイベントとして追加されます。







このファイルで休日文字列がどのように定義されているかを詳しく見てみましょう。 休日に関する情報を格納する文字列は、その名前、日付、カレンダー識別子で構成されます。 グレゴリオ暦だけでなく日付が表示される多くの国では、日付変換を実行する必要があることに注意してください。

 ... [] 42 ...    ,1424/3/12,6 ...
      
      







これらの日付変換は、.NETを使用している場合、組み込みツールを使用して簡単に実行できます。



ユーザーの生活を楽にするためにXtraSchedulerに休日機能を実装する際に、このファイルをダウンロードする機能を提供しましたが、私たち自身は使用していません。 このデータをロードし、日付に対して必要な操作を実行する別のクラスを作成しました。 同時に、異なるカレンダー間で必要な日付変換はすべて当社によって実行され、追加のコードを記述する必要はありません。



変換を実行するためにサポートされているカレンダーの数は、以下のコードから確認できます。

 public class OutlookHolidaysLoader { #region CalendarTypes consts internal const int CAL_GREGORIAN = 1; internal const int CAL_GREGORIAN_ARABIC = 10; internal const int CAL_GREGORIAN_ME_FRENCH = 9; internal const int CAL_GREGORIAN_US = 2; internal const int CAL_GREGORIAN_XLIT_ENGLISH = 11; internal const int CAL_GREGORIAN_XLIT_FRENCH = 12; internal const int CAL_HEBREW = 8; internal const int CAL_HIJRI = 6; internal const int CAL_JAPAN = 3; internal const int CAL_JULIAN = 13; internal const int CAL_KOREA = 5; internal const int CAL_TAIWAN = 4; internal const int CAL_THAI = 7; #endregion internal const int DefaultCalendarType = CAL_GREGORIAN; public string[] ExtractLocations(string fileName) { } public string[] ExtractLocations(Stream stream) { } public HolidayBaseCollection FromFile(string fileName) { } public HolidayBaseCollection FromFile(string fileName, string[] locations) { } public HolidayBaseCollection FromFile(string fileName, Encoding encoding, string[] locations) { } public HolidayBaseCollection FromStream(Stream stream) { } public HolidayBaseCollection FromStream(Stream stream, string[] locations) { } public HolidayBaseCollection FromStream(Stream stream, Encoding encoding, string[]) { } }
      
      





同様の休日機能には、 ASPxSchedulerDXScheduler for WPFなどの製品があります。

ASPxSchedulerでの動作については、 オンラインデモをご覧ください。



iCalendarおよびoutlook.holからのダウンロードに加えて、スケジューラは休日のコレクションをXML形式でダウンロードして保存できます。

  //... HolidayBaseCollection holidays = HolidayCollectionXmlPersistenceHelper.ObjectFromXml(string xml); //.... new HolidayCollectionXmlPersistenceHelper(holidays).ToXml();
      
      







アプリで休日のサポートが必要な場所はどこですか? 考えられるシナリオの1つは、一時データの大きなリストを表示するときに不要な日をフィルタリングすることです。 例として、プランナーに従って、不要な日付を連続して捨てる週末と休日のサポートを実装した製品XtraChartsを提供します。



ちょっとした分析



ボーナスとして、Outlookファイルから取得した統計情報を提供します。 休日を含むoutlook.holファイルをダウンロードし、2010年の日付をフィルター処理して結果を視覚化し、さまざまな国の年間の数を計算しました。



次のグラフは、2010年の国別祝祭日の分布を示しています。





国ごとの休日の数の完全なリストは、以下の凡例に反映されています。





宗教上の祝日を考慮に入れない場合、祝日数の主要国がかかることに気付くのは簡単です

中国カナダアメリカ合衆国



欧州連合リビアインドマレーシアの休日の最小数。



ロシアは12の値で中間の位置にあります。



もちろん、これらの数字は公式の祝日のみを示しており、休日の総数の実際の状況を反映していないことを理解する必要があります。 結論を出すために(例えば、誰が最も「祝う」国で、誰が「仕事中毒国」であるか)私はあなたに与えます... :-)



新年あけましておめでとうございます!!!



All Articles