0

イベント プロバイダの開始時刻を計算しようとしています。

私は3つの変数を持っています:

DateTime eventStartTime
DateTime currentTime
TimeSpan timeBetweenEvents

eventStartTime任意の日の希望する開始時刻です。たとえば、「6:00AM」 currentTimeは現在の時刻 timeBetweenEventsです。イベント実行間の TimeSpan です。

これは私のコードです:

public static TimeSpan GetTimeToStart(DateTime eventStartTime, DateTime currentTime, TimeSpan timeBetweenEvents)
{
    TimeSpan timeToStart;
    // e.g. if it is before 6:00AM today
    if(DateTime.Now < merchantEventStartTime)
      timeToStart = merchantEventStartTime - DateTime.Now;
    // otherwise process at timeToStart + ISO8601 specified merchantEventProviderSchedule
    else
      timeToStart = merchantEventStartTime - DateTime.Now + merchantEventProviderSchedule;
    return timeToStart;
}
4

1 に答える 1

2

単純な while ループを使用すると、eventStartTime が現在の時刻より後になるまでインクリメントすることで、これを解決できます。これは一部のデータの問題に対して脆弱ですが、必要なことには機能します。

public static TimeSpan GetTimeToStart(DateTime eventStartTime, DateTime currentTime, TimeSpan timeBetweenEvents)
{
    while(eventStartTime < currentTime)
        eventStartTime = eventStartTime.Add(timeBetweenEvents);

    return eventStartTime - currentTime;
}

私の結果を検証する単体テスト:

public void TestGetTimeToStart()
{
    //5AM currentTime
    DateTime now = DateTime.Now;
    var timeToStartBefore6am = AlertingService.GetTimeToStart(
        new DateTime(now.Year, now.Month, now.Day, 6, 0, 0),
        new DateTime(now.Year, now.Month, now.Day, 5, 0, 0),
        XmlConvert.ToTimeSpan("PT12H"));
    Assert.IsNotNull(timeToStartBefore6am);
    Assert.AreEqual(timeToStartBefore6am, new TimeSpan(1, 0, 0));

    //5PM currentTime
    var timeToStartBefore6pm = AlertingService.GetTimeToStart(
        new DateTime(now.Year, now.Month, now.Day, 6, 0, 0),
        new DateTime(now.Year, now.Month, now.Day, 17, 0, 0),
        XmlConvert.ToTimeSpan("PT12H"));
    Assert.IsNotNull(timeToStartBefore6pm);
    Assert.AreEqual(timeToStartBefore6pm, new TimeSpan(1, 0, 0));

    //7PM currentTime
    var timeToStartAfter6pm = AlertingService.GetTimeToStart(
        new DateTime(now.Year, now.Month, now.Day, 6, 0, 0),
        new DateTime(now.Year, now.Month, now.Day, 19, 0, 0),
        XmlConvert.ToTimeSpan("PT12H"));
    Assert.IsNotNull(timeToStartAfter6pm);
    Assert.AreEqual(timeToStartAfter6pm, new TimeSpan(11, 0, 0));
}
于 2013-03-28T23:52:57.247 に答える