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

如何按指定日期自动添加/移除代码中的.AddHours(-1)语句?

解决时间调整逻辑的区间切换问题

嘿,这个需求其实挺常见的——根据特定时间区间切换代码逻辑,我给你几个简单易维护的实现方式:

方案1:直接硬编码日期区间(最简便)

最直观的做法就是定义好两个关键时间点,然后判断当前时间是否在「不需要调整」的区间内,再决定是否执行AddHours(-1)。代码清晰直白,后续修改也很容易。

代码示例

// 定义两个关键时间点(推荐用UTC时间避免时区混乱,根据你的系统实际情况调整)
var noAdjustmentStart = new DateTime(2018, 11, 4, 0, 0, 0, DateTimeKind.Utc);
var noAdjustmentEnd = new DateTime(2019, 3, 10, 0, 0, 0, DateTimeKind.Utc);
var currentTime = DateTime.UtcNow;

// 处理开始时间
var rawStartTime = Convert.ToDateTime(r25EventStartDate.InnerText);
var adjustedStartTime = currentTime >= noAdjustmentStart && currentTime < noAdjustmentEnd 
    ? rawStartTime 
    : rawStartTime.AddHours(-1);
reservationRow["EventStartTime"] = adjustedStartTime.ToString("hh:mm tt");

// 处理结束时间
var rawEndTime = Convert.ToDateTime(r25EventEndDate.InnerText);
var adjustedEndTime = currentTime >= noAdjustmentStart && currentTime < noAdjustmentEnd 
    ? rawEndTime 
    : rawEndTime.AddHours(-1);
reservationRow["EventEndTime"] = adjustedEndTime.ToString("hh:mm tt");

如果不想重复判断逻辑,可以把时间调整封装成一个小方法,让代码更整洁:

private DateTime AdjustEventDateTime(DateTime originalTime)
{
    var noAdjustmentStart = new DateTime(2018, 11, 4, 0, 0, 0, DateTimeKind.Utc);
    var noAdjustmentEnd = new DateTime(2019, 3, 10, 0, 0, 0, DateTimeKind.Utc);
    return DateTime.UtcNow >= noAdjustmentStart && DateTime.UtcNow < noAdjustmentEnd
        ? originalTime
        : originalTime.AddHours(-1);
}

// 调用方式
reservationRow["EventStartTime"] = AdjustEventDateTime(Convert.ToDateTime(r25EventStartDate.InnerText)).ToString("hh:mm tt");
reservationRow["EventEndTime"] = AdjustEventDateTime(Convert.ToDateTime(r25EventEndDate.InnerText)).ToString("hh:mm tt");

方案2:配置化管理(适合后续需频繁调整的场景)

如果之后可能需要修改这些时间点,或者不想把日期硬编码在代码里,可以把关键日期放到配置文件中(比如appsettings.json或者Web.config),这样不用重新编译就能调整规则。

配置示例(appsettings.json)

"TimeAdjustmentRules": {
  "DisableAdjustmentFrom": "2018-11-04T00:00:00Z",
  "DisableAdjustmentTo": "2019-03-10T00:00:00Z"
}

代码示例(读取配置)

// 从配置读取时间点(这里以.NET Core的配置读取为例,其他框架类似)
var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var noAdjustmentStart = DateTime.Parse(config["TimeAdjustmentRules:DisableAdjustmentFrom"]);
var noAdjustmentEnd = DateTime.Parse(config["TimeAdjustmentRules:DisableAdjustmentTo"]);
var currentTime = DateTime.UtcNow;

// 后续调整逻辑和方案1完全一致
var rawStartTime = Convert.ToDateTime(r25EventStartDate.InnerText);
var adjustedStartTime = currentTime >= noAdjustmentStart && currentTime < noAdjustmentEnd 
    ? rawStartTime 
    : rawStartTime.AddHours(-1);
reservationRow["EventStartTime"] = adjustedStartTime.ToString("hh:mm tt");

关键注意事项

  • 时区问题:一定要统一时间标准!推荐用UTC时间定义关键节点和获取当前时间,避免服务器时区不同导致判断出错。
  • 边界测试:记得测试2018-11-04 00:00:00和2019-03-10 00:00:00这两个临界点的逻辑是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:04:26