アカウントの有効期限が30日未満であるかどうかを調べようとしています。DateTime Compareを正しく使用していますか?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
回答:
DateTime Compareを正しく使用していますか?
いいえCompare
。2つの日付の相対的な位置に関する情報のみを提供します:より小さい、等しい、またはより大きい。あなたが欲しいのはこのようなものです:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
これは2DateTime
秒を差し引きます。結果は、プロパティTimeSpan
を持つオブジェクトTotalDays
です。
さらに、条件は次のように直接記述できます。
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
if
必要ありません。
Days
はの最大のコンポーネントであるため、違いはありませんTimeSpan
。これを読んでいる人は、Seconds
プロパティが同じように機能すると考えるためにそれを推定することができます。
Days
それ自体も間違っている可能性があります。Days
とTotalDays
は条件が< 30
であるという理由だけでここでは同じですが<= 30
、そうであった場合は明らかな違いがあります。これは、TotalDays
がまだ戻る30.421
間などを返す可能性があるためです。Days
30
する必要があります
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
合計日数に注意してください。そうしないと、厄介な動作が発生します
TotalDays
は、概念的に正しいフィールドです。実際には、同じ結果が得られDays
ますがTimeSpan
、が最大のコンポーネントであるという理由だけで、月または年のコンポーネントがあり、これは別の話でした。で試してみるかHours
、Seconds
またはMilliseconds
それらがどのように機能するかを確認してください。
代わりにこれを試してください
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
これにより、正確な結果が得られます。
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
いいえ、Compare関数は1、0、または-1のいずれかを返します。2つの値が等しい場合は0、-1と1はより小さいとより大きいことを意味し、私はその順序を信じていますが、私はしばしばそれらを混同します。
いいえ、正しく使用していません。
詳細はこちらをご覧ください。
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");
実際、これらの答えはどれも私にはうまくいきませんでした。私は次のようにしてそれを解決しました:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
私がこれをやろうとしたとき:
matchFound = (expiryDate - DateTime.Now).Days < 30;
今日、2011-11-14と私のexpiryDateは2011-10-17でしたが、matchFound = -28でした。28の代わりに。それで私は最後のチェックを逆にしました。
// 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;
}
}