Ответ 1
Создайте новое значение DateTime, когда компонент миллисекунды установлен в 0:
dt = dt.AddMilliseconds(-dt.Millisecond);
Это, наверное, немой вопрос, но я не могу понять это. Я сравниваю 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;
}
Заранее спасибо
Создайте новое значение DateTime, когда компонент миллисекунды установлен в 0:
dt = dt.AddMilliseconds(-dt.Millisecond);
Я рекомендую использовать метод расширения:
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())
Следует соблюдать осторожность, если dt
имеет ненулевые микросекунды (доли миллиса). Установка только миллисекунд на ноль недостаточно.
Чтобы установить миллисы и ниже на нуль (и получить успешное сравнение), код будет выглядеть следующим образом:
dt = dt.AddTicks(-dt.Ticks % TimeSpan.TicksPerSecond); // TimeSpan.TicksPerSecond=10000000
TimeSpan difference = dtNew - dtOrig;
if (difference >= TimeSpan.FromSeconds(1))
{
...
}
Вы можете вычесть их, чтобы получить TimeSpan
.
Затем используйте TimeSpan.totalSeconds()
Это избыток для одного 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
}
Один из способов - создать новые даты, введя в конструктор год, месяц, день, час, минуту, секунду. Кроме того, вы можете просто сравнить каждое значение отдельно.
Эфир задает миллисекунды в другом времени datetime равным нулю или вычитает одну дату из другой и просто проверяет свойство TotalMinutes
результирующего промежутка времени.
Вы можете создать метод расширения, который установил бы миллисекунды на ноль для объекта 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;
сортировать строки и сравнивать их. прост и хорошо работает.
return string.Compare(dtOrig.ToString("s"), dtNew.ToString("s"),
StringComparison.Ordinal) == 0;
Самый простой способ сократить время - это отформатировать его и проанализировать единицы, которые вы хотите:
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;
}
Не знаю, почему почти всем программистам нужны дополнительные строки, чтобы вернуть значение bool из функции с выражением bool.
вместо
if (dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds())
return true;
else
return false;
вы всегда можете просто использовать
return dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds()
если выражение истинно, оно возвращает true else false.