Подтвердить что ты не робот

Игнорировать миллисекунды при сравнении двух дат

Это, наверное, немой вопрос, но я не могу понять это. Я сравниваю LastWriteTime двух файлов, однако он всегда терпит неудачу, потому что файл, загруженный с сети, всегда имеет миллисекунды, установленные в 0, и мой исходный файл имеет фактическое значение. Есть ли простой способ игнорировать миллисекунды при сравнении?

Здесь моя функция:

//compare file dates
public bool CompareByModifiedDate(string strOrigFile, string strDownloadedFile)
{
     DateTime dtOrig = File.GetLastWriteTime(strOrigFile);
     DateTime dtNew = File.GetLastWriteTime(strDownloadedFile);

     if (dtOrig == dtNew)
        return true;
     else
        return false;
}

Заранее спасибо

4b9b3361

Ответ 1

Создайте новое значение DateTime, когда компонент миллисекунды установлен в 0:

dt = dt.AddMilliseconds(-dt.Millisecond);

Ответ 2

Я рекомендую использовать метод расширения:

public static DateTime TrimMilliseconds(this DateTime dt)
{
    return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0);
}

тогда его справедливо:

if (dtOrig.TrimMilliseconds() == dtNew.TrimMilliseconds())

Ответ 3

Следует соблюдать осторожность, если dt имеет ненулевые микросекунды (доли миллиса). Установка только миллисекунд на ноль недостаточно.
Чтобы установить миллисы и ниже на нуль (и получить успешное сравнение), код будет выглядеть следующим образом:

dt = dt.AddTicks(-dt.Ticks % TimeSpan.TicksPerSecond); // TimeSpan.TicksPerSecond=10000000

Ответ 4

TimeSpan difference = dtNew - dtOrig;
if (difference >= TimeSpan.FromSeconds(1))
{
    ...
}

Ответ 5

Вы можете вычесть их, чтобы получить TimeSpan.

Затем используйте TimeSpan.totalSeconds()

Ответ 6

Это избыток для одного Truncate, но если у вас есть несколько и разных типов, вы можете сделать это, используя обобщенный метод расширения ниже:

DateTime dtSecs = DateTime.Now.TruncateTo(Extensions.DateTruncate.Second);
DateTime dtHrs  = DateTime.Now.TruncateTo(Extensions.DateTruncate.Hour);

Больше общего Использование Метод расширения:

    public static DateTime TruncateTo(this DateTime dt, DateTruncate TruncateTo)
    {
        if (TruncateTo == DateTruncate.Year)
            return new DateTime(dt.Year, 0, 0);
        else if (TruncateTo == DateTruncate.Month)
            return new DateTime(dt.Year, dt.Month, 0);
        else if (TruncateTo == DateTruncate.Day)
            return new DateTime(dt.Year, dt.Month, dt.Day);
        else if (TruncateTo == DateTruncate.Hour)
            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, 0, 0);
        else if (TruncateTo == DateTruncate.Minute)
            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, 0);
        else 
            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);

    }
    public enum DateTruncate
    {
        Year,
        Month,
        Day,
        Hour,
        Minute,
        Second
    }

Ответ 7

Один из способов - создать новые даты, введя в конструктор год, месяц, день, час, минуту, секунду. Кроме того, вы можете просто сравнить каждое значение отдельно.

Ответ 8

Эфир задает миллисекунды в другом времени datetime равным нулю или вычитает одну дату из другой и просто проверяет свойство TotalMinutes результирующего промежутка времени.

Ответ 9

Вы можете создать метод расширения, который установил бы миллисекунды на ноль для объекта DateTime

public static DateTime ZeroMilliseconds(this DateTime value) {
  return new DateTime(value.Year, value.Month, value.Day, 
    value.Hours, value.Minutes, value.Seconds);
}

Затем в вашей функции

 if (dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds())
        return true;
     else
        return false;

Ответ 10

сортировать строки и сравнивать их. прост и хорошо работает.

    return string.Compare(dtOrig.ToString("s"), dtNew.ToString("s"), 
StringComparison.Ordinal) == 0;

Ответ 11

Самый простой способ сократить время - это отформатировать его и проанализировать единицы, которые вы хотите:

var myDate = DateTime.Parse(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss"));

Метод DOK переписан

public bool CompareByModifiedDate(string strOrigFile, string strDownloadedFile)
    {
         DateTime dtOrig = DateTime.Parse(File.GetLastWriteTime(strOrigFile).ToString("MM/dd/yyyy hh:mm:ss"));
         DateTime dtNew = DateTime.Parse(File.GetLastWriteTime(strDownloadedFile).ToString("MM/dd/yyyy hh:mm:ss"));

         if (dtOrig == dtNew)
            return true;
         else
            return false;
    }

Ответ 12

Не знаю, почему почти всем программистам нужны дополнительные строки, чтобы вернуть значение bool из функции с выражением bool.

вместо

if (dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds())
    return true;
 else
    return false;

вы всегда можете просто использовать

return dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds()

если выражение истинно, оно возвращает true else false.