1

真夜中の時刻を常に保持している日時のリストと、その日にウェブサイトが「稼働」していると見なされた秒数があります。

「稼働時間」のパーセンテージを計算する必要があるため、その日の正確な秒数を知る必要があります。.NET に DateTime.DaysInMonth(year, month) に似たものがあるかどうか疑問に思っていましたが、1 日の秒数です。

私の Google-fu は私を失望させたようです。私が見つけることができるのは、1 日の秒数に対して .NET 定数だけですか? -しかし、それは夏時間を考慮していません。

と同じくらい簡単だと思います

var secondsInDay = (startDay.AddDays(1) - startDay).TotalSeconds;

しかし、これが正しいかどうか疑問に思っていました (単純ではあるが網羅的ではないテストが正しいことを示しています)?
特定の日の秒数を計算するより効率的な方法はありますか?

注意してください - これは夏時間を考慮に入れる必要があります

4

3 に答える 3

1

DateTimeOffsetと を使用する必要があると思いますTimeZoneInfo。この記事、特にDateTimeOffset 値を使用した比較と算術演算セクションの 2 番目のコード スニペットが役立ちます。

そのコードでは、夏時間の DateTimeOffset インスタンスに時間が追加されており、結果は時間の変更を考慮していることがわかります。

編集:以下のコードは、上記の記事から取得したものです (コードはあなたが望むことをしませんが、夏時間を考慮してDateTimeOffset使用されていることを示しています:TimeZoneInfo

    public static void Main()
   {
      DateTime generalTime = new DateTime(2008, 3, 9, 1, 30, 0);
      const string tzName = "Central Standard Time";
      TimeSpan twoAndAHalfHours = new TimeSpan(2, 30, 0);

      // Instantiate DateTimeOffset value to have correct CST offset 
      try
      {
         DateTimeOffset centralTime1 = new DateTimeOffset(generalTime, 
                    TimeZoneInfo.FindSystemTimeZoneById(tzName).GetUtcOffset(generalTime));

         // Add two and a half hours      
         DateTimeOffset centralTime2 = centralTime1.Add(twoAndAHalfHours);
         // Display result
         Console.WriteLine("{0} + {1} hours = {2}", centralTime1, 
                                                    twoAndAHalfHours.ToString(), 
                                                    centralTime2);  
      }
      catch (TimeZoneNotFoundException)
      {
         Console.WriteLine("Unable to retrieve Central Standard Time zone information.");
      }
   }

    // The example displays the following output to the console: 
    //    3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 4:00:00 AM -06:00
于 2013-04-05T20:58:41.247 に答える
0

あなたが求めたことを行う関数は次のとおりです。

public int SecondsInDay(DateTime dateTime, string timeZoneId)
{
    var dt1 = dateTime.Date;
    var dt2 = dt1.AddDays(1);
    var zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);

    var dto1 = new DateTimeOffset(dt1, zone.GetUtcOffset(dt1));
    var dto2 = new DateTimeOffset(dt2, zone.GetUtcOffset(dt2));
    var seconds = (dto2 - dto1).TotalSeconds;

    return (int) seconds;
}

例として:

int s = SecondsInDay(new DateTime(2013, 1, 1), "Central Standard Time");
// 86400

int s = SecondsInDay(new DateTime(2013, 3, 10), "Central Standard Time");
// 82800

int s = SecondsInDay(new DateTime(2013, 11, 3), "Central Standard Time");
// 90000
于 2013-04-05T22:26:49.203 に答える
0

これはどう:

TimeSpan.FromDays(1).TotalSeconds

もちろん、地球の歳差運動を時計と一致させるために、1日に時折追加および削除される秒を考慮しようとしている場合を除きます

日光追跡の場合、あなたの日が によって返される 2 つのうちの 1 つであるかどうかを確認できます。

TimeZone.CurrentTimeZone.GetDaylightChanges(2013)

デルタを追加/削除します

または、1 日ではなく過去 24 時間に基づいて稼働時間を常に計算することで、これらの悪ふざけをスキップできます

于 2013-04-05T20:56:53.840 に答える