Сравните время и посмотрите, прошел ли один час - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь узнать, прошел ли один час с момента создания объекта токена. я использую datetime.utcnow при его создании.

Я пробовал datetime.compare и сравнивал два значения времени даты, но это дает тот же результат, независимо от того, что я делаю .. (не то, что я хочу)

Если по прошествии часа с момента его создания токен должен быть «израсходован», он больше не действителен.

Объект токена

    public int ID { get; set; }

    public int UserId { get; set; }

    public string Token { get; set; }

    public System.DateTime Time_stamp { get; set; }

    public Nullable<bool> Consumed { get; set; }

Мой метод проверки

public bool IsValidToken(string token)
{
        var tokenEntity = this.GetAll().Where(x => x.Consumed == false && x.Token == token).FirstOrDefault();

            if (tokenEntity != null)
            {
                var tokenDate = tokenEntity.Time_stamp;

                var machineDate = DateTime.UtcNow;


                var result = DateTime.Compare(tokenDate, machineDate.AddHours(1));

                if (result > 0)
                {
                    tokenEntity.Consumed = true;
                    this.Update(tokenEntity);
                    return false;
                }
                else
                {
                    return true;
                }
            }
            return false;
        }

Ответы [ 3 ]

4 голосов
/ 07 февраля 2020

Вместо DateTime.Compare() вы можете вычесть два DateTime и получить общее количество часов результирующего DateTime.

Что-то вроде

var result = (DateTime.UtcNow - tokenEntity.Time_stamp).TotalHours;
if(result > 1)
{
   //Do your business logic for expiring token
}
else
   //Your business logic

Попробуйте онлайн

1 голос
/ 07 февраля 2020

«Я пытаюсь выяснить, прошло ли [более] одного часа с момента создания объекта токена»

Проблема заключается в том, что вы добавляете час к текущему времени вместо вычитая час. Вы можете вычесть час, передав -1 методу AddHours.

Тогда есть также проблема, что аргументы находятся в неправильном порядке при вызове Compare, потому что метод Compare вернет 1 если первый аргумент больше второго. Поскольку мы хотим знать, больше ли значение "один час go", чем время создания токена, мы должны сначала передать это значение при вызове Compare:

var result = DateTime.Compare(machineDate.AddHours(-1), tokenDate);

Другой (предпочтительный) вариант - просто использовать оператор > и писать код так, как вы пишете в Engli sh. Другой способ сказать «Я пытаюсь выяснить, прошло ли [более] одного часа с момента создания объекта токена» :

"Является ли текущее время больше, чем сумма времени создания токена плюс один час "

, который можно записать в виде:

if (machineDate > tokenDate.AddHours(1))
0 голосов
/ 07 февраля 2020
// Add -1 hour to simulate timespan being one hour in past
DateTime d1 = DateTime.Now.AddHours(-1);
DateTime d2 = DateTime.Now;
TimeSpan diff = d2 - d1;
bool diffIsGreaterThan1Hour = diff.TotalHours > 1;
...