1

アプリケーションの実行時間をコーディングしようとしましたが、少し難しくなったので、ここでアドバイスを求めます。私のファイル「profgram.cs」で、稼働時間を示す公開日時の魔女を持っています (と思います)。

public static DateTime TimeStarted
    {
        get
        {
            return DateTime.Now;
        }
    }

プログラムが読み込まれると、時間を設定するためのこのコードがあります

TimeSpan span = (TimeSpan)(DateTime.Now - TimeStarted);
Output.WriteLine("The server has initialized successfully (" + span.TotalSeconds + " seconds). Ready for connections.", OutputLevel.Notification); 

次に、稼働時間を実際に表示するために、タイムスパンを表示するケースがあります

case "uptime":
     {
        TimeSpan span = (TimeSpan)(DateTime.Now - Program.TimeStarted);
        Session.SendData(UserAlertModernComposer.Compose("Stats", "Uptime: " + span.TotalMinutes + " minutes"));
        return true;
      }

しかし問題は、常に 0 分と表示されることですか? 私も試してみました.Minutesは.Totalminutesではありません

4

2 に答える 2

3

常に現在の時刻を開始時刻として返します。

TimeStarted値を設定できるように変更し、プログラムの起動時に設定します。

public static DateTime TimeStarted { get; set; }

public static void Main(string[] args)
{
    //set start time
    Program.TimeStarted = DateTime.UtcNow;
}

独自の開始時間を維持する代わりに、現在のプロセスの開始時間を使用できます。

DateTime processStartedAt = System.Diagnostics.Process.GetCurrentProcess().StartTime;

プログラムが開始してからの合計秒数を取得するには、 のTotalSecondsプロパティを使用できますTimeSpan

TimeSpan sinceStarted = (DateTime.UtcNow - Program.TimeStarted);
double secondsRunning = sinceStarted.TotalSeconds;

表示するメッセージを作成する場合は、TimeSpan構造体のプロパティを使用します。

string message = string.Format("{0} Days, {1} hours, and {2} minutes", sinceStarted.Days, sinceStarted.Hours, sinceStarted.Minutes);

コンソール タイトルを定期的に更新する場合は、タイマーを使用できます。タイマーが範囲外に出て収集されないように、これをメインクラスに配置する必要があることに注意してください。

private static System.Threading.Timer timer;

private static void UpdateTitle(object state)
{
    TimeSpan running = DateTime.Now - System.Diagnostics.Process.GetCurrentProcess().StartTime;
    string msg = string.Format("{0} Hours, {1} minutes, {2} seconds", running.Hours, running.Minutes, running.Seconds);
    Console.Title = msg;
}

TimeSpan updatePeriod = TimeSpan.FromSeconds(5);
timer = new System.Threading.Timer(UpdateTitle, null, TimeSpan.Zero, updatePeriod);
于 2013-08-17T11:52:18.043 に答える