control de tiempo

Tengo un método que consulta el directorio activo y devuelve el valor del último restablecimiento de la contraseña a una variable local. Estoy tratando de comparar ese valor con la fecha y la hora actuales, y verificar si han transcurrido menos de 24 horas. Creo que estoy cerca, pero parece que no puedo hacer que esto funcione.

Gracias jason

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"; } } 

Esta:

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

debiera ser

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

Estoy tratando de comparar ese valor con la fecha y la hora actuales, y verificar si han transcurrido menos de 24 horas.

Este código casi se escribe a sí mismo.

 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 } 

Observe cómo el código se lee exactamente como lo especificó en inglés.

¿Qué tal (asumiendo que he leído tus intenciones correctamente):

 // 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"; } 
 if (DateTime.Now.Subtract(passwordLastSet).TotalHours < 24) Console.WriteLine("Try again"); else Console.WriteLine("all is good"); 

También puedes usar TotalDays <1

está comparando una variable de cadena y una variable de fecha y hora, no es posible compararla

  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"; } } 

cambia tu cadena a DateTime

Si quieres compararlo con la hora actual.

solo usa esto

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

Si desea verificarlo más de 24, cambie tanto el intervalo de tiempo como su comparación.

Ser pedante

  • Debe verificar los casos especiales antes de convertir a DateTime; por ejemplo, pwdLastSet puede ser cero , por lo que debe verificar esto antes de intentar la conversión.

  • pwdLastSet se almacena como UTC, por lo que la conversión a la hora local con DateTime.FromFileTime puede devolver una hora ambigua .

    Por lo tanto, sería mejor usar DateTime.FromFileTimeUtc y comparar con DateTime.UtcNow .

Dependiendo de lo que quiera lograr exactamente, también puede querer verificar las marcas de userAccountControl, algo como lo siguiente (sin probar):

  [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 { // ... presumbly password has never been reset } } else { DateTime lastResetUtc = DateTime.FromFileTimeUtc(lastReset); // ... etc - compare with DateTime.UtcNow } 

intente DateTime.Now.AddHours(-24) <= passwordLastSet como quiere simular que ahora es 24 horas en el pasado, no en el futuro