1. ホーム
  2. c#

1日の開始時刻と終了時刻の取得方法

2023-10-27 05:11:42

質問内容

私のC#アプリでは、fromとtoの日付を表すyyyymmdd-yyyymmddのフォーマットの文字列変数を渡します。私はこれらの日付の開始時刻と終了時刻をそれぞれ取得したいです。現在、私は以下のコードを持っていますが、よりエレガントなソリューションがあるかどうか疑問に思っていました。

つまり、pdr = 20090521-20090523 の場合、 "20090521 00:00:00" と "20090523 23:59:59" が取得されます。

private void ValidateDatePeriod(string pdr, out DateTime startDate, 
                                out DateTime endDate)
{
    string[] dates = pdr.Split('-');

    if (dates.Length != 2)
    {
        throw new Exception("Date period is of incorrect format");
    }

    if (dates[0].Length != 8 || dates[1].Length != 8)
    {
        throw new Exception("Split date periods are of incorrect format");
    }

    startDate = DateTime.ParseExact(dates[0] + " 00:00:00", 
        "yyyyMMdd HH:mm:ss", null);
    endDate = DateTime.ParseExact(dates[1] + "23:59:59", 
        "yyyyMMdd HH::mm:ss", null);
}

どのように解決するのですか?

.Netの精度だけが心配なら...。

startDate = DateTime.ParseExact(dates[0], "yyyyMMdd");
endDate = DateTime.ParseExact(dates[1], "yyyyMMdd").AddTicks(-1).AddDays(1);

時間部分の文字列に余分な値を連結する必要は本当にないのです。


補足ですが、これを例えばデータベースに対するクエリに使用する場合...

startDate = DateTime.ParseExact(dates[0], "yyyyMMdd");
endDate = DateTime.ParseExact(dates[1], "yyyyMMdd").AddDays(1);

のクエリで...

WHERE "startDate" >= @startDate AND "endDate" < @endDate

そうすれば、コメントで指摘された精度の問題は本当に問題にならなくなります。 その 終了日 は範囲の一部ではなく、境界の外側になります。