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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:20:08