【发布时间】:2020-08-16 12:11:17
【问题描述】:
以下工作相当不错:
using System;
using System.Threading;
namespace cursor_position
{
class Program
{
static void Main(string[] args)
{
DateTime startTime = DateTime.Now;;
TimeSpan timeRemaining;
int intCount = 119;
for (int i = 0; i <= intCount; i++)
{
Thread.Sleep(2000);
Console.Clear();
timeRemaining = TimeSpan.FromTicks(DateTime.Now.Subtract(startTime).Ticks * (intCount - (i+1)) / (i+1));
Console.SetCursorPosition(0, 0);
Console.Write("ETA: ");
Console.Write(String.Format("{0} Minutes, {1} Seconds", timeRemaining.Minutes, timeRemaining.Seconds));
Console.WriteLine();
}
}
}
}
但是,就在最后,我得到了 ETA 计算的负数。代码运行的时间越长(如果我增加sleep 或intCount),ETA 的负数就越大。
有人知道为什么吗?
【问题讨论】:
-
这是因为时间延迟越大,Ticks 乘以 -1 越大(考虑 i=59 的情况,您的剩余时间由 Ticks*(59-60)/60 计算)。
-
你为什么不按秒倒数呢?
-
我会考虑使用 Microsoft 的反应式框架 (NuGet "System.Reactive") - 然后你可以这样做:
DateTime startTime = DateTime.Now; DateTime targetTime = startTime.AddMinutes(1.0); var query = Observable.Interval(TimeSpan.FromSeconds(1.0)).Select(x => targetTime.Subtract(DateTime.Now)); query.Subscribe(x => Console.WriteLine($"ETA: {x.Minutes} Minutes, {x.Seconds} Seconds"));。
标签: c# .net datetime .net-core