【问题标题】:Checking TimeSpan检查时间跨度
【发布时间】:2011-02-10 17:48:16
【问题描述】:

我有一个查询活动目录的方法,并将上次密码重置的值返回给局部变量。我正在尝试将该值与当前日期和时间进行比较,并检查它是否少于 24 小时。我想我已经接近了,但似乎无法让它发挥作用。

谢谢, 杰森

string passwordLastSet = string.Empty;
passwordLastSet = DateTime.FromFileTime((Int64)(result.Properties["PwdLastSet"][0])).ToString();  
public string lastReset(DateTime pwordLastReset)
{
    if (DateTime.Now.AddHours(24) <= passwordLastSet)
    {
        return "try again later";
    }
    else
    {
        return "all is good";
    }
}

【问题讨论】:

    标签: c# .net .net-3.5


    【解决方案1】:

    我正在尝试将该值与当前日期和时间进行比较,并检查它是否少于 24 小时。

    这段代码几乎是自己写的。

    DateTime timeOfLastPasswordReset = // get time of last password reset
    DateTime now = DateTime.Now;
    TimeSpan difference = now.Subtract(timeOfLastPasswordReset);
    if(difference < TimeSpan.FromHours(24)) {
        // password was reset less than twenty-four hours ago
    }
    else {
        // password was reset no less than twenty-four hours ago
    }
    

    注意代码的阅读方式与您用英文指定的完全一样。

    【讨论】:

      【解决方案2】:

      这个:

       if (DateTime.Now.AddHours(24) <= passwordLastSet)
      

      应该是

         if (DateTime.Now <= passwordLastSet.AddHours(24))
      

      【讨论】:

        【解决方案3】:

        怎么样(假设我已经正确阅读了你的意图):

        // Does passwordLastSet, with 24 hours added to it, fall before or after DateTime.Now?
        // If AFTER, then reject, if BEFORE, then accept
        if (passwordLastSet.Add(new TimeSpan(24, 0, 0)) > DateTime.Now)
        {
            // Password was last set within the last 24 hours
            return "try again later";
        }
        else
        {
            return "all is good";
        }
        

        【讨论】:

          【解决方案4】:
          if (DateTime.Now.Subtract(passwordLastSet).TotalHours < 24)
              Console.WriteLine("Try again");
          else
              Console.WriteLine("all is good");
          

          您也可以使用 TotalDays

          【讨论】:

            【解决方案5】:

            学究气:

            • 您需要在转换为 DateTime 之前检查特殊情况 - 例如 pwdLastSet can be zero,因此您应该在尝试转换之前检查此内容。

            • pwdLastSet 存储为 UTC - 因此使用 DateTime.FromFileTime 转换为本地时间可能会返回 an ambiguous time

              所以最好使用DateTime.FromFileTimeUtc并与DateTime.UtcNow进行比较。

            根据您想要实现的具体目标,您可能还需要检查 userAccountControl 标志 - 类似于以下内容(未经测试):

                [Flags]
                private enum AdsUserFlags
                {
                    Script = 0x1,
                    AccountDisabled = 0x2,
                    HomeDirectoryRequired = 0x8,
                    AccountLockedOut = 0x10,
                    PasswordNotRequired = 0x20,
                    PasswordCannotChange = 0x40,
                    EncryptedTextPasswordAllowed = 0x80,
                    TempDuplicateAccount = 0x100,
                    NormalAccount = 0x200,
                    InterDomainTrustAccount = 0x800,
                    WorkstationTrustAccount = 0x1000,
                    ServerTrustAccount = 0x2000,
                    PasswordDoesNotExpire = 0x10000,
                    MnsLogonAccount = 0x20000,
                    SmartCardRequired = 0x40000,
                    TrustedForDelegation = 0x80000,
                    AccountNotDelegated = 0x100000,
                    UseDesKeyOnly = 0x200000,
                    DontRequirePreauth = 0x400000,
                    PasswordExpired = 0x800000,
                    TrustedToAuthenticateForDelegation = 0x1000000,
                    NoAuthDataRequired = 0x2000000
                }
            
                ...
                AdsUserFlags userAccountControl = (AdsUserFlags)result.Properties["userAccountControl"][0];
                long lastReset = (long)result.Properties["PwdLastSet"][0];
            
                if (lastReset == 0L)
                {
                    if ((userAccountControl & AdsUserFlags.PasswordDoesNotExpire) == 0)
                    {
                        // ... user must set password at next login
                    }
                    else
                    {
                        // ... presumably password has never been reset
                    }
                }
                else
                {
                    DateTime lastResetUtc = DateTime.FromFileTimeUtc(lastReset);
                    // ... etc - compare with DateTime.UtcNow
                }
            

            【讨论】:

              【解决方案6】:

              尝试DateTime.Now.AddHours(-24) &lt;= passwordLastSet,因为您想模拟现在是过去 24 小时,而不是未来

              【讨论】:

                【解决方案7】:

                您正在比较一个字符串变量和一个日期时间变量,无法比较它们

                 DateTime passwordLastSet = DateTime.FromFileTime((Int64)(result.Properties["PwdLastSet"][0]));  
                 public string lastReset(DateTime pwordLastReset)
                 {
                     if (DateTime.Now.AddHours(24) <= passwordLastSet)
                     {
                         return "try again later";
                     }
                     else
                     {
                         return "all is good";
                     }
                 }
                

                如果要将字符串与当前时间进行比较,请将其更改为 DateTime。

                就用这个

                if (DateTime.Now <= passwordLastSet)
                {
                    return "try again later";
                }
                else
                {
                    return "all is good";
                }
                

                如果您想检查它是否大于 24,请将两者都更改为 TimeSpan 并进行比较。

                【讨论】:

                • 如果我将 String passwordLastSet 更改为上次设置的 DateTime 密码,我会收到一个编译错误“无法将类型 'string' 隐式转换为我正在读取的 'System.DateTime',因为我需要更改返回类型,或将字符串转换为日期时间。
                • DateTime.FromFileTime((Int64)(result.Properties["PwdLastSet"][0])).ToString();此行导致错误
                • 更改它 DateTime.FromFileTime((Int64)(result.Properties["PwdLastSet"][0]));
                • 我刚刚意识到自己评论的答案,我只需要删除 .ToString
                猜你喜欢
                • 2015-09-20
                • 2014-01-09
                • 1970-01-01
                • 2020-10-10
                • 2021-10-15
                • 2018-01-07
                • 1970-01-01
                • 2012-07-19
                • 1970-01-01
                相关资源
                最近更新 更多