您是否曾经想过 “我们生活在几个维度中”?您可能会迅速回答“三维”,但答案远比乍看起来要复杂得多。爱因斯坦的相对论挑战你换一种思维方式,它暗示时间本身就是一个维度。
在仿真建模中,管理和操作时间的能力至关重要。AnyLogic 作为一款功能强大的仿真工具,为用户提供了对时间和日期的全面控制,从而实现了高级模型定制。为了有效处理与日期相关的场景,了解如何使用 Java 类来设置日期非常重要。
例如:
- 供应链在某些季节可能会出现路线中断。由于天气原因,一些运输路线可能无法通行。通过使用日期 Java类,模型可以检测到这些日期并通过备用路线重新规划路径。
- 公共节假日也会影响业务。在这些日期,生产可能会停止,这与一年中的其他时间不同。使用日期 Java类,您可以创建特定于日期的逻辑,以考虑这些非运营期。
通过学习在 AnyLogic 中创建日期和使用日期Java 类,您可以动态、准确地仿真此类场景。这篇博客文章详细介绍了如何将这些技术融入仿真模型中,以应对复杂的时间相关行为。
目录:
如何在 AnyLogic 中使用日期
创建日期
在AnyLogic 中,最基本的与日期相关设置的是开始日期和停止日期,它们定义了仿真运行的开始时间和停止时间。即使没有明确创建日期,也请确保这些设置已经默认设置好了。您可以随时根据实验的属性对它们进行调整。
所有内容都应在模型运行前手动设置。但如果我们需要动态定义开始日期和停止日期呢?例如,模型可能需要在仿真运行前从外部来源(如数据库或 Excel 文件)获取开始日期和停止日期。您可以使用 AnyLogic 引擎 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);
通过上面的代码,您可以创建所需的日期,并将其设置为模型的开始日期和停止日期。这些函数应在仿真运行前字段中调用。
注意:这些函数需要一个日期类型对象作为输入。
使用 LocalDate Java 类创建日期
Java的Date类常用于设置日期,但它并非最便捷的选择。Date类从 1900 年开始计算年份,因此需要用 "125"来表示2025年。此外,Date类的月份索引从"0,"开始,这意味着 2月 是 第1个 月。在使用Date类创建日期时,必须注意这些特点。
另外,更为现代且便捷的Java类 LocalDate 提供了更多增强功能。您可以更轻松地初始化LocalDate对象,然后将其结果转换为Date类型,因为AnyLogic的函数仍然需要这种类型:
//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 设置日期比较简单,但由于需要转换到Java 类Date,代码可能看起来比较复杂。为了提高可读性和可维护性,可以考虑在 AnyLogic 中定义一个单独的自定义函数来处理这种转换:
它简化了上述代码,并允许您在需要时重复使用:
//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 有很大的优势。此外,还有 Java 的 LocalTime 类,它允许您在设置日期的同时设置时间。
使用 Java 的 SimpleDateFormat 类以所需格式创建日期
前面,我们介绍了如何设置模型的开始和停止日期。不过,您也可以在模型中设置任何其他日期并将其用作变量,或使用 date() 函数检索当前模型日期。
在许多情况下,您可能不仅仅想创建日期,还希望在控制台或模型的用户界面中显示日期。当您提供 Date 或 LocalDate 对象时,输出格式可能会有所不同,可能如下所示:

但是,如果我们想用不同的格式查看这个日期呢?例如,您更喜欢将其显示为 “12/27/2024”,但 Date 和 LocalDate 都使用不同的默认表示形式。希望 Java 的 SimpleDateFormat 类能让你创建任意想要的自定义日期格式。只需要创建该类的实例,设置所需的格式,并在需要的地方调用该实例的 format(...) 函数,并在其中传入日期即可:
SimpleDateFormat customFormat = new SimpleDateFormat ("MM/dd/yYYY") ;
Date currentDate = date ();
traceln (customFormat. format (currentDate)) ;
您可以查看数字时钟示例模型中的示例代码,或者查看我们将在本文后续部分讨论的其他模型中的代码。
使用CalendarView模型通过拾取器组件创建日期
我们的一些用户偶尔会提出请求,希望有一种更便捷的方式来创建日期,而不是通过编写代码来实现。尽管目前AnyLogic中没有内置这样的组件,但我们开发了一个使用自定义日历或日期拾取器对象的模型。它为用户提供了方便且直观的日期选择方式。
该模型包含上述所有最佳实践。您可以从 AnyLogic Cloud 下载该模型,并在您的项目中使用日历组件。此外,您还可以根据需要对其进行定制。
隐患
在 AnyLogic 中处理日期时,您需要留意可能会遇到的隐患。您可能需要在模型中设置或获取当前的实际日期。您可以使用 Date Java 类的以下代码来实现这一目的:
Date currentDate = new Date();
or in case of LocalDate class:
LocalDate currentLocalDate = LocalDate.now();
当模型运行时,日期是由机器当前的操作系统时间决定的。这意味着在不同机器上运行模型时,结果可能会有所不同,从而可能影响模型的可重复性。
例如,一个模型可能包含一个基于时区运行的时间表元素。AnyLogic 模型的时区由用户在机器操作系统中设置的时区决定,整个模型都在该时区内运行。
由于不同时区的夏令时规则不同,因此在不同地区的计算机上运行模型时,模型结果可能会有差异。为确保结果一致,无论机器设置如何,都应通过代码明确设置所需的时区。例如:
注意:如AnyLogic Help中所列,所有这些因素也会导致运行不可重现。
通过AnyLogic实现对时间和日期的完全掌控
想象一下,要是在现实生活中能完全掌控时间,那将会带来数不清的好处!虽然在现实里这是不可能的,但仿真建模能让您即刻实现这种 “魔法”。运用我们提供的在 AnyLogic 中借助 Java 类创建日期的技巧,你就能充满信心地将日期和时间逻辑融入到您的模型中。
你尝试过时间操控了吗?现在正是开始的最佳时机——只需下载AnyLogic然后立即开启体验!