【发布时间】:2010-10-06 09:58:05
【问题描述】:
我正在尝试确定帐户是否会在 30 天内到期。我是否正确使用了 DateTime 比较?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
【问题讨论】:
我正在尝试确定帐户是否会在 30 天内到期。我是否正确使用了 DateTime 比较?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
【问题讨论】:
你可以尝试这样做:
var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{
// ...
}
【讨论】:
假设您要将false(如果适用)分配给matchtime,则更简单的编写方法是......
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
【讨论】:
我是否正确使用了 DateTime 比较?
没有。 Compare 仅提供有关两个日期的相对位置的信息:小于、等于或大于。你想要的是这样的:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
这减去两个DateTimes。结果是一个具有TotalDays 属性的TimeSpan 对象。
另外,条件可以直接写成:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
不需要if。
【讨论】:
TotalDays 而不是天数。
Days 是TimeSpan 的最大组成部分。阅读本文的人可以推断认为Seconds 属性的工作方式相同。
Days 本身也可能是错误的。 Days 和 TotalDays 在这里是一样的,只是因为条件是< 30,但是如果是<= 30 就会有明显的区别,因为TotalDays 可能返回类似30.421 而Days 仍然返回30。
Compare 分别为大于、等于、小于返回 1、0、-1。
你想要:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
【讨论】:
// this isn't set up for good processing.
//I don't know what data set has the expiration
//dates of your accounts. I assume a list.
// matchfound is a single variablethat returns true if any 1 record is expired.
bool matchFound = false;
DateTime dateOfExpiration = DateTime.Today.AddDays(-30);
List<DateTime> accountExpireDates = new List<DateTime>();
foreach (DateTime date in accountExpireDates)
{
if (DateTime.Compare(dateOfExpiration, date) != -1)
{
matchFound = true;
}
}
【讨论】:
实际上,这些答案都不适合我。我通过这样做解决了它:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
当我尝试这样做时:
matchFound = (expiryDate - DateTime.Now).Days < 30;
今天,2011 年 11 月 14 日,我的到期日期是 2011 年 10 月 17 日,我得到了 matchFound = -28。而不是 28。所以我反转了最后一次检查。
【讨论】:
Compare 是不必要的,Days / TotalDays 是不必要的。
你只需要
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
请注意,如果您决定使用几分钟或几个月甚至几年作为到期标准,这将起作用。
【讨论】:
这将为您提供准确的结果:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
【讨论】:
应该是
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
记下总天数 否则你会得到奇怪的行为
【讨论】:
TotalDays 在概念上是正确的使用字段。实际上,它们给出了相同的结果,但这只是因为Days 是TimeSpan 的最大组成部分,如果有月或年组成部分,这将是一个不同的故事。只需尝试使用 Hours、Seconds 或 Milliseconds 看看它们是如何工作的。
试试这个
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
【讨论】:
好吧,我会这样做:
TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30)
matchFound = true;
Compare 只响应一个整数,表示第一个天气较早、相同或较晚...
【讨论】:
不,这不正确,试试这个:
DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
matchFound = true;
}
【讨论】:
您要做的是减去两个 DateTimes(expiryDate 和 DateTime.Now)。这将返回一个 TimeSpan 类型的对象。 TimeSpan 有一个属性“天”。将该数字与 30 进行比较即可得出答案。
【讨论】:
不,你没有正确使用它。
详情请见here。
DateTime t1 = new DateTime(100);
DateTime t2 = new DateTime(20);
if (DateTime.Compare(t1, t2) > 0) Console.WriteLine("t1 > t2");
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2");
if (DateTime.Compare(t1, t2) < 0) Console.WriteLine("t1 < t2");
【讨论】:
不,Compare 函数将返回 1、0 或 -1。 0 当两个值相等时,-1 和 1 表示小于和大于,我相信这个顺序,但我经常混淆它们。
【讨论】: