0

私のデータベースでは、日付はdatetimeのように保存されますが、検索/フィルタリングを実行したいときは、正確な時間を無視して日付のみに基づいてください。私はそれを行う方法を理解するのに多くの時間を費やし、最終的に自分で実用的な解決策を得ました:

string val = rule.Data;
if (!string.IsNullOrEmpty(val))
{
switch (rule.Field)
                    {
                        case "Date": {
                        DateTime parsedDate = DateTime.ParseExact(
                                val,
                                "dd/MM/yyyy",
                                CultureInfo.InvariantCulture);

                        var pYear = parsedDate.Year;
                        var pMonth = parsedDate.Month;
                        var pDay = parsedDate.Day;

rows = rows.Where(o => o.Date >= parsedDate && o.Date <= new DateTime(pYear, pMonth, pDay, 12, 59, 40)); break;
                        }
                    }

}

これは正常に機能しています。少し変更が必要ですが、上記のコードを使用できると思います。しかし、今日、私の大学は、ここで開発された以前のプロジェクトからのソリューションを私に渡しました。このソリューションははるかに短く、可能であればそれを使用したいと思います。次のようになります。

        string val = rule.Data;
        if (!string.IsNullOrEmpty(val))
        {
            switch (rule.Field)
            {
            case "Date": { rows = rows.Where(o => o.Date.ToString("dd/MM/yyyy") == val); break; }
            }
        }

これを試してもコードは壊れませんが、データもフィルタリングしていません。私はいつも空の結果を得ます。o.Date.ToString("dd/MM/yyyy")問題はそこにあると思います。ToString()DateTime オブジェクトにこのように使用しても問題ないかわかりません。私が使用している例ではToString()、ここで提供しているようなフォーマット タイプも取得していますToString("dd/MM/yyyy")が、私の場合ToString()はどこにもオーバーロードされていません。これは DateTime オブジェクトを操作する標準的な方法ですか、それともToStrin()定義済みの場所が見つかりません。最後に、上記のコードに基づく実際の例を教えてください。

4

3 に答える 3

1

o.Date の文化に応じて、次を試してください。

    string val = rule.Data;
    if (!string.IsNullOrEmpty(val))
    {
        switch (rule.Field)
        {
              case "Date":
              {
                rows = rows.Where(o => o.Date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) == 
                                          DateTime.ParseExact(val,
                                          "dd/MM/yyyy",
                                          CultureInfo.InvariantCulture));
                break;
              }
        }
    }

または、代わりに現在のスレッドのカルチャを設定できます。

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

編集:文字列の使用を避けるとうまくいくはずです:

例えば

DateTime maxDate = new DateTime(2020, 11, 17);

if (DateTime.Now.Date > maxDate)
{
   // this will just work regardless of setting culture
}
于 2013-06-18T08:22:24.790 に答える
0

文字列をまったく使用する必要はありません。データベースにa datetime(または類似) があり、DateTimeC# コードに a がある場合、文字列を中間ステップとして使用する正当な理由はありません。

.Kindまた、価値観の特性にも細心の注意を払う必要がありDateTimeます。また、現地時間を と比較してはいけませんDateTime.Now。その場合、夏時間への移行中にエラーが発生する可能性があります。代わりに、UTCDateTime値を使用するか、代わりに値を使用する必要がありDateTimeOffsetます。 詳細はこちらをご覧ください

于 2013-06-18T18:50:23.803 に答える