AnyLogic で日付を作成する: Java のヒントとカスタム カレンダー モデル

日付が記載されたカレンダーページ

「私たちは何次元に住んでいるのだろう?」と考えたことはありませんか?すぐに 3 次元と答えるかもしれませんが、答えは複雑です。アインシュタインの相対性理論は、時間自体が次元であるということを示唆し、違った考え方をするように促します。

シミュレーション モデリングでは、時間を管理および操作する機能が重要です。強力なシミュレーション ツールである AnyLogic は、ユーザーに時間と日付の完全な制御を提供し、高度なモデル カスタマイズを可能にします。日付関連のシナリオを効果的に処理するには、Java クラスを使用して日付を設定する方法を理解することが重要です。

例えば:

  • サプライ チェーンでは、特定の季節要因や気象条件によって輸送ルートの中断が発生する場合があります。日付用の Java クラスを使用すると、モデルはこれらの日付を検出し、代替パスを経由してルートを変更することができます。
  • 祝日も製造が停止するなどの理由によりビジネスに影響を与える可能性があります。日付用の Java クラスを使用すると、これらの非稼働期間を考慮した日付固有のロジックを作成できます。

日付の作成方法を学び、AnyLogic で日付用の Java クラスを操作することで、このようなシナリオを動的かつ正確にモデル化できます。このブログ記事では、シミュレーション モデルで複雑な時間関連の動作を処理する主な方法について説明します。

コンテンツ:

  1. AnyLogicで日付を操作する方法
  2. 注意点
  3. 日付を完全に制御する

AnyLogic で日付を操作する方法

日付を作成

AnyLogic の最も基本的な日付関連の設定は、シミュレーション実行の開始と終了を定義する開始日終了日です。日付を明示的に作成していない場合でも、これらの設定がデフォルトで設定されていることを確認してください。実験のプロパティに合わせていつでも調整できます。

モデル時間設定用の AnyLogic インターフェイス

シミュレーション実験のプロパティにおけるモデル時間設定 (クリックして拡大)

モデルを実行する前に、すべてを手動で設定する必要があります。しかし、開始日と終了日を動的に定義する必要がある場合はどうでしょうか。たとえば、モデルでは、シミュレーションを実行する前に、データベースや Excel ファイルなどの外部ソースから開始日と終了日を取得する必要があります。これは、AnyLogic の Engine Java クラスの関数を使用して実現できます。このクラスには、プログラムでアクセスできます (たとえば、実験のプロパティ内):

//Initialize my dates
Date startDate = new Date (125, 1, 20); //Date is 02/20/2025
Date stopDate = new Date (125, 1, 28); //Date is 02/28/2025
//Set the dates above as the model's start and stop date getEngine ().setStartDate (startDate) ;
getEngine () .setStopDate (stopate); 

上記のコードを使用すると、必要な日付を作成し、それをモデルの開始日と終了日として設定できます。これらの関数は、実験のシミュレーション実行前のアクション フィールドで呼び出す必要があります。

注: これらの関数は、入力として Date 型のオブジェクトを想定しています。

LocalDate Java クラスを使用して日付を作成

Date Java クラスは日付の設定によく使用されますが、最も便利なクラスではありません。年は 1900 年から数えられるため、 2025年を表すには「125」を使用します。また、月は「0」から始まるインデックスで、2 月が 1 月目となります。シミュレーション モデルで Date Java クラスを使用して日付を作成する場合は、これらの特殊性を考慮する必要があります。

よりモダンで便利な LocalDate Java クラスは、強化された機能を提供します。AnyLogic の機能では依然としてこの型が必要なので、LocalDate オブジェクトをより簡単に初期化し、結果を Date 型に変換できます。

//Initialize my dates
LocalDate startDateLocal = LocalDate.of (2025, 2, 20); //Date is 02/20/2025
LocalDate stopDateLocal = LocalDate.of (2025, 2, 28)://Date is 02/28/2025
			
//Conversion from LocalDate to Date
Date startDate = Date. from (startDateLocal
	• atStartOfDay () .atZone (ZoneId.systemDefault () ).toInstant ()) ;
			
Date stopDate = Date. from (stopDateLocal
	•atStartOfDay () .atzone (ZoneId.systemDefault ()).toInstant ()) ;
	
//Set the dates above as the model's start date and stop date 
getEngine () .setStartDate (startDate) ;
getEngine () . setStopDate (stopDate);

LocalDate を使用すると日付の設定が簡単になりますが、Date Java クラスへの変換が必要なため、コードが複雑になる場合があります。読みやすさと保守性を高めるために、この変換を処理するために AnyLogic 内で別のカスタム関数を定義することを検討してください。

AnyLogic で LocalDate 型オブジェクトを Date 型に変換する

LocalDate 型オブジェクトを Date 型に変換する (クリックして拡大)

上記のコードを簡素化し、必要に応じて再利用できるようにします:

//Initialize my dates
LocalDate startDateLocal = LocalDate.of (2025, 2, 20); //Date is 02/20/2025
LocalDate stopDateLocal = LocalDate.of (2025, 2, 28);//Date is 02/28/2025

//Conversion from LocalDate to Date
Date startDate = convertToDate (startDateLocal);
Date stopDate = convertToDate (stopDateLocal);

//Set the dates above as the model's start date and stop date 
getEngine () .setStartDate (startDate) ;
getEngine () •setStopDate (stopDate) ;

LocalDate クラスには、日付の操作を簡素化する多くの関数が用意されています。たとえば、plusDays(...) 関数を使用すると、指定した日数後の日付を簡単に計算できます。古い Date クラスで同じ結果を得るのは、はるかに複雑になります。したがって、LocalDate を使用すると、大きな利点が得られます。さらに、日付とともに時刻を設定できる LocalTime Java クラスもあります。

SimpleDateFormat Java クラスを使用して、希望の形式で日付を作成

先ほど、モデルの開始日と終了日を設定する方法について説明しました。また、モデル内で他の日付を設定して変数として使用したり、date() 関数を使用して現在のモデルの日付を取得したりすることもできます。

多くの場合、日付を作成するだけでなく、コンソールまたはモデルのユーザー インターフェイスに表示することも必要になります。Date または LocalDate オブジェクトを指定すると、出力形式はさまざまになり、次のようになります:

Date および LocalDate Java クラスによって初期化された日付のデフォルト表示
Date および LocalDate Java クラスによって初期化された日付のデフォルトの文字列表現

しかし、この日付を別の形式で表示したい場合はどうすればよいでしょうか。たとえば、「12/27/2024」としたいのですが、Date と LocalDate はどちらも異なるデフォルトの表現を使用します。幸い、SimpleDateFormat Java クラスを使用すると、任意のカスタム日付形式を作成できます。このクラスのインスタンスを作成し、必要な形式を設定し、作成されたオブジェクトの format(...) 関数を呼び出して日付を渡します:

SimpleDateFormat customFormat = new SimpleDateFormat ("MM/dd/yYYY") ;
Date currentDate = date ();
traceln (customFormat. format (currentDate)) ;

サンプル コードは、デジタル ウォッチのサンプル モデル、またはこの記事で後ほど説明する他のモデルで確認できます。

CalendarView モデルを使用して、ピッカーコンポーネント経由で日付を作成

一部のユーザーから、コードではなく、よりユーザーフレンドリーな方法で日付を作成したいという要望が寄せられています。現在、AnyLogic にはそのような組み込みコンポーネントはありませんが、カスタム Calendar または Date Picker オブジェクトを使用するモデルを開発しました。これにより、ユーザーは便利で直感的に日付を選択できます。

このモデルには、上で説明したすべてのベストプラクティスが組み込まれています。AnyLogic Cloud からモデルをダウンロードし、プロジェクトでカレンダー コンポーネントを自由にご活用ください。さらに、必要に応じてカスタマイズすることもできます。

CalendarView モデル(ソースファイル)

注意点

AnyLogic で日付を扱う場合、遭遇する可能性のあるいくつかの落とし穴に注意する必要があります。モデル内で現在の実際の日付を設定または取得する必要がある可能性があります。これは、Date Java クラスで次のコードを使用して実現できます:

Date currentDate = new Date();
or in case of LocalDate class:
LocalDate currentLocalDate = LocalDate.now();

日付は、モデルが実行されたときのマシンの現在のオペレーティング システム時刻によって決まります。つまり、異なるマシンでのモデル実行によって結果が異なる可能性があり、モデルの再現性に影響する可能性があります。

たとえば、モデルには、タイム ゾーンに基づいて動作する Schedule 要素が含まれている場合があります。AnyLogic モデルのタイム ゾーンは、マシンのオペレーティング システムで設定されているユーザーのタイム ゾーンによって決定され、モデル全体がそのタイム ゾーン内で動作します。

夏時間のルールはタイムゾーンによって異なるため、異なる場所のコンピューターで実行するとモデルの結果が異なる場合があります。一貫した結果を得るには、マシンの設定に関係なく、コードを使用して目的のタイムゾーンを明示的に設定します。

AnyLogic のデフォルトのタイムゾーンを変更

デフォルトのタイムゾーンをカスタム AWST に変更 (クリックして拡大)

注: AnyLogic Help に記載されているように、このような要因によって、再現不可能な実験も発生します。

AnyLogic で時間と日付を完全に制御

現実世界で時間を完全に制御できると想像してみてください。数え切れないほどの利点があります。現実には不可能ですが、シミュレーション モデリングを使用すると、今すぐにこの魔法を制御できます。AnyLogic の Java クラスを使用して日付を作成するためのヒントを使用すると、日付と時刻のロジックを、自信を持ってモデルに組み込むことができます。


時間操作を試したことがありますか? いつ試しますか?今が始めるのに最適な時です。AnyLogic をダウンロードして、すぐに始めましょう!

AnyLogicをダウンロード

関連記事