AnyLogic时区修改及夏令时(DST)禁用方法咨询
AnyLogic时区修改与夏令时(DST)禁用方案
1. 修改模型时区
AnyLogic基于Java时区系统,完全支持自定义时区,操作方式如下:
- 在模型
Main代理的On startup事件中添加代码,设置全局默认时区:// 示例1:设置为UTC时区(无夏令时) TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // 示例2:设置为中国标准时区(Asia/Shanghai,无夏令时) // TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); // 示例3:设置为美国东部时区(带夏令时,如需禁用见下文) // TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); - 可使用Java标准时区ID,如"Europe/London"、"Africa/Johannesburg"等,覆盖全球主流时区。
2. 禁用夏令时(解决DST切换的时间偏移问题)
针对你遇到的相对时间调度在DST切换时偏移1小时的问题,提供两种核心解决方案:
方案一:使用无夏令时的时区
最简便的方式是切换到本身不实行夏令时的时区(如UTC、Asia/Shanghai),从根源上消除DST影响,设置方法参考上述时区修改代码。
方案二:自定义禁用DST的时区
若必须使用原本带夏令时的时区,可创建自定义时区并强制关闭DST规则:
// 创建GMT+2时区(模拟东欧时区),禁用夏令时 SimpleTimeZone customTZ = new SimpleTimeZone(7200*1000, "GMT+2_NoDST"); customTZ.setDSTSavings(0); // 取消夏令时的时间偏移量 customTZ.setStartRule(SimpleTimeZone.DST_NO_START_RULE); // 禁用夏令时启动规则 customTZ.setEndRule(SimpleTimeZone.DST_NO_END_RULE); // 禁用夏令时结束规则 TimeZone.setDefault(customTZ);
修复相对时间调度偏移的细节
你已用toTimeoutInCalendar(DAY, 1)处理事件,但基于毫秒/分钟的相对延迟(如delay(24*60))仍会受DST影响,需替换为日历时间调度:
- 替换相对延迟为日历方法:
// 延迟1天(基于日历计算,不受DST切换影响) toTimeoutInCalendar(DAY, 1); - 调度固定时间点事件,直接计算日历时间:
Calendar nextTrigger = Calendar.getInstance(); nextTrigger.add(Calendar.DAY_OF_YEAR, 1); nextTrigger.set(Calendar.HOUR_OF_DAY, 10); // 设置为每天10点触发 nextTrigger.set(Calendar.MINUTE, 0); nextTrigger.set(Calendar.SECOND, 0); delay(nextTrigger.getTimeInMillis() - getTime());
内容的提问来源于stack exchange,提问作者Agathe
相关产品推荐
相关产品推荐

