如何将WPF计时器格式化为HH:MM:SS

时间:2019-01-31 07:09:09

标签: c# wpf

我正在开发一个程序,该程序显示单击按钮后的时间。问题是,当我希望将时间显示为“ 00:00:01”,“ 00:00:02”时,时间仅显示为“ 1”,“ 2”,“ 3”等。

这是在WPF中。我到处搜寻,发现有人说您使用

increment.ToString("hh\\:mm\\:ss\\);  

但是当我这样做时,它在我的程序中确实显示了“ hh:mm:ss”。下面是我的代码。我剪掉了不重要的内容,所以您不必通读所有内容。预先感谢!

    private int increment = 0;

    private void dtTicker(object sender, EventArgs e)
    {
        increment++;
        lblTest.Content = increment.ToString("hh\\:mm\\:ss\\.fff");

    }

    private void StartStop_Click(object sender, EventArgs e)
    {
        DispatcherTimer dt = new DispatcherTimer();

        if ((string)StartStop.Content == "START")
        {
            dt.Interval = new TimeSpan(0, 0, 1);
            dt.Tick += dtTicker;
            dt.Start();

4 个答案:

答案 0 :(得分:3)

您使用的格式字符串用于DateTime和TimeSpan,而不是整数。您实际上不能依靠DispatchTimer做到100%准确,因此在启动时记下当前时间:

private DateTime start;

// .. start timer...
start = DateTime.Now;

然后在滴答处理程序中计算经过的时间并传递您正在使用的格式字符串:

TimeSpan elapsed = DateTime.Now - start;
string str = elapsed.ToString("hh\\:mm\\:ss");  

答案 1 :(得分:1)

您的计时器配置为间隔为1秒。除非您在其他地方更改变量增量,否则增量应反映经过的秒数。

要以必需的格式显示,您可以使用TimeSpan.FromSeconds将数字转换为TimeSpan

var increment = 34;
lblTest.Content =TimeSpan.FromSeconds(increment).ToString();

请注意,默认格式为“ hh:mm:ss”,因此您可以跳过格式设置。

输出

00:00:34

答案 2 :(得分:0)

您在错误的假设下进行操作,即DispatcherTimer会精确地每秒触发一次Tick事件。不一定是这种情况。
您想要做的是花时间开始,然后在每个刻度中显示在那之后经过的时间。像这样:

private TimeSpan timeElapsed = TimeSpan.Zero;
private DateTime started = DateTime.MinValue;

private void StartStop_Click(object sender, EventArgs e)
{
    DispatcherTimer dt = new DispatcherTimer();

    if ((string)StartStop.Content == "START")
    {
        dt.Interval = new TimeSpan(0, 0, 1);
        dt.Tick += dtTicker;
        started = DateTime.Now;
        dt.Start();
    }
}

private void dtTicker(object sender, EventArgs e)
{
    timeElapsed = timeElapsed.Add(DateTime.Now - started);
    lblTest.Content = (timeElapsed).ToString(@"hh\:mm\:ss");

}

// This is how you reset the timer in this version.
private void ResetTimer()
{
    timeElapsed = TimeSpan.Zero;
}

答案 3 :(得分:0)

为了获得经过的时间而不计算计时器停止的时间,您应该存储两个值:

/// <summary>
/// Global counter that increments while the timer is active
/// </summary>
private TimeSpan totalElapsed = new TimeSpan(0);
/// <summary>
/// Save the last relevant point in time to compute the next elapsed increment
/// </summary>
private DateTime lastPointInTime = DateTime.MinValue;

在计时器(重新)启动时初始化lastPointInTime

dt.Interval = new TimeSpan(0, 0, 1);
dt.Tick += dtTicker;
// reset lastPointInTime in order to skip time from when the timer was stopped
lastPointInTime = DateTime.Now;
dt.Start();

并将其用于每个刻度,以便在显示之前更新totalElapsed

var nextPointInTime = DateTime.Now;
totalElapsed += (nextPointInTime - lastPointInTime);
lastPointInTime = nextPointInTime;
lblTest.Content = totalElapsed.ToString(@"hh\:mm\:ss"); // format string optional