1

すべてが盛り上がることを願っています!

私はこの問題を解決したいと思っていましたが、今朝いくつかのエラーが発生したようです。

これはasp.netWebアプリケーションであり、このセクションはC#にあります。ドロップダウンリストに、すべてタイプがであるopenTime、closeTime、および15分の間隔を動的に入力していますTimeSpan

TimeSpan interval = new TimeSpan(0,15,0);

    for (TimeSpan i = openTime; i <= closeTime; i = i.Add(interval))
    {

        string stringTime = i.ToString();
        ddlTime.Items.Add(new ListItem(stringTime, stringTime));
    }

これは、時間が真夜中を超えていない場合に最適です。元:

  • openTime:07:00(7:00 am)
  • closeTime:10:00(10:00 am)

期待どおりに入力されます:

  • 07:00:00
  • 07:15:00
  • 07:30:00
  • 07:45:00
  • 10:00:00

これがうまくいかないのは、開場時間が深夜前に始まり、閉店時間が深夜以降に始まるときです。

  • openTime:11:00(11:00 am)
  • closeTime:02:00(2:00 am)

移入する必要があります

  • 11:15:00
  • 11:30:00
  • 11:45:00
  • 2:00:00

ただし、すぐにわかるように、このシナリオではopenTimeがcloseTimeに対して<=でないため、ループは実行されません。

別のforループを作成して、closeTime<=openTimeで目的の結果が得られないかどうかを確認するだけです。私は得るだろう:

  • 02:00:00
  • 02:15:00
  • 02:30:00
  • 11:00:00

このテーマについてより経験豊富な人は、これを正常に機能させるために必要なロジックを提供できますか?

お時間をいただきありがとうございます、クリス。

4

4 に答える 4

4

開始と終了のそれぞれにforを作成し、最後に到達するまでDateTimeそれをループしTimeOfDay、各値にforを取得する方がよいようです。

TimeSpan interval = TimeSpan.FromMinutes(15);

for (DateTime current = openTime; current <= closeTime; current += interval)
{
    string stringTime = current.TimeOfDay.ToString();
    ddlTime.Items.Add(new ListItem(stringTime, stringTime));
}

これで、(たとえば)2012年6月28日の午後11時のオープン時間と、2012年6月29日の午前2時のクローズ時間がある場合は、正常に機能します。

TimeSpansとしてオープン/クローズ時間を取得する場合は、いつでも次を使用できます。

// The dates don't really matter here... we just want a sample start/end
// for an opening period
DateTime open = new DateTime(2000, 1, 1) + openTimespan;
DateTime close = new DateTime(2000, 1, 1) + closeTimespan;

if (open > close)
{
    close = close.AddDays(1);
}

もちろん、個人的には、特定のタイプを持つ独自の.NET日時APIであるNoda TimeLocalTimeを使用することをお勧めしますが、それは別の問題です:)

于 2012-06-28T15:59:17.273 に答える
0

TimeSpan日付も気になるのに、なぜこれにを使用しているのですか?

の代わりにTimeSpan.Add(interval)、を使用し、コードの残りの部分を変更して、オブジェクトではなくオブジェクトをDateTime.Add(new TimeSpan(0,0,interval))回避します。DateTimeTimeSpan

于 2012-06-28T15:59:47.303 に答える
0

DateTimeを使うべきところにTimeSpanを使うと思います。

于 2012-06-28T16:00:06.093 に答える
0

いくつかのオプションがあります。

  1. DateTime代わりに構造を使用して、15分の増分を実行します。DateTime.TimeOfDayあなたのデータとしてに取ってください。(これは私がこれを書いている間に他の人によって提案されました)
  2. TimeSpan値が24時間を超える場合に24時間を差し引くロジックを含めます。

#1と他の人からの提案に関する1つの重要な注意事項は、夏時間の不可避な時間変更です。フォールバックするときにシーケンスに重複がないこと、またはスプリングフォワードするときに1時間ブロックをスキップすることを確認する必要があります。

これは理にかなっていますか?

よろしく。

于 2012-06-28T16:05:15.177 に答える