You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AnyLogic中根据模型时间获取对应年度周数?

AnyLogic 基于模型时间获取对应年度周数的实现方法

适用场景区分

  • 启用日历模式的模型:模型时间绑定真实日历规则、设置了起始日期与时区,可直接调用内置方法结合Java时间API计算,是绝大多数业务场景的默认情况。
  • 使用虚拟连续时间的模型:未绑定真实日历,仅以自定义时间单位推进仿真,需要先明确周计数的起始规则再计算。

日历模式实现(推荐)

以下代码默认遵循ISO 8601周数规则:每周从周一开始,每年第一周需包含当年1月4日,是国内、国际通用的周数统计标准。
直接在需要获取周数的位置(如变量赋值、事件触发逻辑、Agent行动代码块)插入以下代码即可:

// 将当前AnyLogic模型时间转换为Java本地日期对象
java.time.LocalDate currentDate = dateToJavaDate(getModelTime());
// 获取对应年度的ISO周数
int weekOfYear = currentDate.get(java.time.temporal.WeekFields.ISO.weekOfWeekBasedYear());
// 可选:获取周数对应的归属年份,解决年初/年末跨年周的年份错位问题
int weekBelongYear = currentDate.get(java.time.temporal.WeekFields.ISO.weekBasedYear());

如果需要自定义周统计规则(比如以周日为一周起点、第一周只要包含1月1日就算当年第一周),替换周规则定义即可:

// 自定义规则:每周日为第一天,第一周最少包含1天即算入当年
java.time.temporal.WeekFields customRule = java.time.temporal.WeekFields.of(java.time.DayOfWeek.SUNDAY, 1);
int customWeekNum = currentDate.get(customRule.weekOfWeekBasedYear());

虚拟连续时间模式实现

如果模型没有绑定日历,以模型启动时间为周数计数起点,可直接按时间单位换算(示例以天为模型基础时间单位):

// 计算从模型启动到当前经过的天数
long passedDays = (long) time(DAY);
// 按7天为1周换算,启动时刻为第1周
int weekNumFromStart = (int) Math.floor(passedDays / 7.0) + 1;

注意事项

  • 不要使用老旧的java.util.Calendar类计算周数,该类默认读取JVM时区配置,周数规则不透明,很容易出现跨年周计算错误。
  • 如果模型配置了非默认时区,先确认模型时区设置和周数统计要求的时区一致,避免跨时区日期偏移。
  • 如果需要按周触发固定逻辑(比如周度数据统计、周度调度事件),直接使用AnyLogic内置的循环事件,触发模式选择Weekly即可,比手动判断周数更稳定,不容易出边界bug。

内容的提问来源于stack exchange,提问作者dkdelta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:45:30