DateTime。日付が30日未満かどうかを確認する方法を比較しますか?


86

アカウントの有効期限が30日未満であるかどうかを調べようとしています。DateTime Compareを正しく使用していますか?

if (DateTime.Compare(expiryDate, now) < 30)

{
     matchFound = true;
}

回答:


232

DateTime Compareを正しく使用していますか?

いいえCompare。2つの日付の相対的な位置に関する情報のみを提供します:より小さい、等しい、またはより大きい。あなたが欲しいのはこのようなものです:

if ((expiryDate - DateTime.Now).TotalDays < 30)
    matchFound = true;

これは2DateTime秒を差し引きます。結果は、プロパティTimeSpanを持つオブジェクトTotalDaysです。

さらに、条件は次のように直接記述できます。

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

if必要ありません。


2
2+を与えることを許可されるべきです;)答えのための1つとそれを表現するための短い方法のための1つ
CheGueVerra 2009

4
ええと…答えを長くしたので、想像上の票を1つ引いてください。;-)
Konrad Rudolph

1
TotalDays日の代わりにご利用ください。
ジョアン・ポルテラ

2
概念的にはより正確です。Daysはの最大のコンポーネントであるため、違いはありませんTimeSpan。これを読んでいる人は、Secondsプロパティが同じように機能すると考えるためにそれを推定することができます。
ジョアン・ポルテラ

2
JoãoPortelaが指摘した点に加えて、Daysそれ自体も間違っている可能性があります。DaysTotalDaysは条件が< 30であるという理由だけでここでは同じですが<= 30、そうであった場合は明らかな違いがあります。これは、TotalDaysがまだ戻る30.421間などを返す可能性があるためです。Days30
Racil Hilan 2014

15

する必要があります

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

合計日数に注意してください。そうしないと、厄介な動作が発生します


この回答は、承認された回答を最後に編集してから1年以上経過しています。
ミッチウィート

@ Mitch-これは正解です。彼がDaysではなくTotalDaysを使用していることに注意してください。
マルセロメイソン

受け入れられた答えは正しいです。TotalDaysは小数部分も返しますが、これは整数と比較すると冗長です。
ミッチウィート

1
@MitchWheatTotalDaysは、概念的に正しいフィールドです。実際には、同じ結果が得られDaysますがTimeSpan、が最大のコンポーネントであるという理由だけで、月または年のコンポーネントがあり、これは別の話でした。で試してみるかHoursSecondsまたはMillisecondsそれらがどのように機能するかを確認してください。
ジョアン・ポルテラ

7

代わりに、次のようにします。

TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30) 
   matchFound = true;

Compareは、最初の天気が早い、同じ、または遅いことを示す整数でのみ応答します。


6

代わりにこれを試してください

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}

1
うーん、有効期限が過ぎていない限り、日付の順序を逆にするか、絶対値を取る必要があります。
Konrad Rudolph

3

Compareは、より大きい、等しい、より小さい場合、それぞれ1、0、-1を返します。

あなたが欲しい:

    if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
    { 
        bool matchFound = true;
    }

1

これにより、正確な結果が得られます。

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;

実際に何が起こるかは、例えば、expryDteが28/4/2011である場合、U rite(expiryDate-DateTime.now)にも時間がかかります(28/4/2011 12:00:00 AM-26 / 4/2011 11 :47:00 AM)以上のコードは、28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AMとして値を取りますが、正確な違いはありません。
Jayant

1

比較、不要である/ TotalDaysは不要です。

あなたに必要なのは

if (expireDate < DateTime.Now) {
    // has expired
} else {
    // not expired
}

有効期限の基準として数分、数か月、さらには数年を使用する場合は、これが機能することに注意してください。


1
今は時間、分、秒も考慮しているので、良い答えではありません。DateTime.Todayは、OPの状況に対してより正確です。
JL。

1

false(該当する場合)をに割り当てたいとするとmatchtime、より簡単な書き方になります。

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);

ここでの三項演算子は、((expiryDate --DateTime.Now).TotalDays <30)がすでにブール値を返すため、完全に冗長です。
ファビオ

@Fabio Thanksバディは、戻り値の型を介してブール値を割り当てるためにそれらを削除しました。
マジックミック

0

いいえ、Compare関数は1、0、または-1のいずれかを返します。2つの値が等しい場合は0、-1と1はより小さいとより大きいことを意味し、私はその順序を信じていますが、私はしばしばそれらを混同します。


0

いいえ、正しく使用していません。

詳細はこちらをご覧ください。

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");

0

あなたがしたいのは、2つのDateTime(expiryDateとDateTime.Now)を引くことです。これにより、TimeSpanタイプのオブジェクトが返されます。TimeSpanには「Days」プロパティがあります。あなたの答えのためにその数を30と比較してください。


0

いいえ、正しくありません。これを試してください:

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}

0

実際、これらの答えはどれも私にはうまくいきませんでした。私は次のようにしてそれを解決しました:

  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の代わりに。それで私は最後のチェックを逆にしました。


0
// 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;
            }
            }

1
それは少し複雑ではありませんか?
最大

質問のaccountExpireDatesの言及はどこにありますか?悪い解決策をコピーして貼り付けました。matchFoundは、PatternまたはRegExをミキシングしているように聞こえます。ところで、一致するものが見つかった場合、またはループし続けた場合は、中断する必要があります。また、-2の場合はどうなりますか?MSDNには、可能な値は-1、0と1と言っていません
Mukus

0

あなたはこのようにすることを試みることができます:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}

6
説明はもっとわかりやすくしてください。
borchvm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.