试图将今天的日期与一个月前的日期进行比较

Mic*_*l A 2 .net c# datetime date

我有一个从数据库加载配置的对象.我存储上次使用日期时间字段(被调用GroupsLastRun)运行作业的时间,并且我存储了作业应该使用调用的字符串字段运行的频率Captureusersandgroups.Captureusersandgroups存储三种不同类型'DAILY','WEEKLY'和'MONTHLY'.

基本上,我只有在作业运行时才能继续循环.到目前为止,我已经达到了以下几点:

if (configEntity.GroupsLastrun > DateTime.Now.AddDays(-1) && configEntity.Captureusersandgroups == "DAILY") continue;
if (configEntity.GroupsLastrun > DateTime.Now.AddDays(-7) && configEntity.Captureusersandgroups == "WEEKLY") continue;
if (configEntity.GroupsLastrun > DateTime.Now.AddDays(-30) && configEntity.Captureusersandgroups == "MONTHLY") continue;
Run Code Online (Sandbox Code Playgroud)

我确信(确定)有一个更好的方法,但主要是一个SQL Server开发人员,我缺乏批判性思维/工具来接近这个.什么是更好的方法或我应该学习什么,所以我可以更好地考虑这个?

Jon*_*eet 7

几点:

  • 除非您想受时区和夏令时转换等的影响,否则我会使用DateTime.UtcNow而不是DateTime.Now(并确保您也存储 UTC值)
  • 正如pswg所提到的,值得只询问当前的日期/时间 - 而不是表现,我会说重要的原因是为了保持一致性.在这种情况下,看起来你只会实际使用其中一个值,但在其他情况下我看到人们写的条件是同时使用两个评估,如果代码在午夜运行会导致问题
  • 由于检查条件并同时确定截止日期,您已经重复了代码.我把两者分开了.

所以,我有这样的代码:

// Consider whether you actually want DateTime.UtcNow.Date
DateTime now = DateTime.UtcNow;

DateTime deadline;
switch (configEntity.Captureusersandgroups)
{
    case "DAILY": deadline = now.AddDays(-1);
    case "WEEKYLY": deadline = now.AddDays(-7);
    case "MONTHLY": deadline = now.AddMonths(-1);
    // I'm assuming there's *always* a schedule
    default: throw new InvalidOperationException("Invalid schedule");
}
if (configEntity.GroupsLastrun > deadline)
{
    continue;
}
Run Code Online (Sandbox Code Playgroud)

请注意,从"now"减去一个月与从"then"添加一个月不同.例如,如果最后一次运行是在1月30日,那么下一次运行将不会在3月1日之前使用上述代码 - 而如果您在1月30日添加了一个月,那么接下来将在2月28日运行(除非您使用两个值的日期).仔细考虑您想要的行为.

(作为一个快速插件,我显然也建议考虑我的Noda Time库来进行日期/时间工作.它可以更清楚地表明任何特定值是本地时间还是某个时区等)