如何按指定日期自动添加/移除代码中的.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
相关产品推荐
相关产品推荐

