将TimeSpan格式化为倒数计时器的正确方法是什么?

时间:2010-08-09 21:21:26

标签: c# string-formatting timespan

我有一个在网站上运行的计时器。它将检索用户在订单到期前的时间长度。在大多数情况下,这工作正常,服务器将返回剩余的初始时间,javascript将执行倒计时。所以它显示

2:30 2:29 2:28

然后由于某种原因,在某些页面加载(似乎在计时器剩余时间少于60秒时发生),格式化转为

-1:0-45 -1:0-46 -1:0-47

这是负责格式化时间跨度的代码:

<%= (TimeRemaining.TotalMinutes - 1).ToString("N0") %>:<%= TimeRemaining.Seconds.ToString("N0").PadLeft(2,'0') %>

我也尝试了以下相同的结果。

<%= String.Format("{0:0}:{1:00}", TimeRemaining.TotalMinutes-1, TimeRemaining.Seconds)%>

我还检查了TimeRemaining,如果TotalSeconds是&lt; = 0,那么它只返回new TimeSpan(0),所以它永远不会变为负数。这不是javascript搞砸了倒计时,因为我可以禁用它并仍然看到混乱的格式化时间。

有更好/更清洁的方法吗?

1 个答案:

答案 0 :(得分:4)

我可以看到的一个错误是你不应该在这里减去一个:

TimeRemaining.TotalMinutes - 1

如果剩余时间少于30秒,并且您减去一分钟,则会得到一个负数。

TimeSpan timeRemaining = TimeSpan.FromSeconds(25);
string s = (timeRemaining.TotalMinutes - 1).ToString("N0");
Console.WriteLine(s);

结果:

-1

相反,您应该将此数字向下舍入为整数(也称为截断)。您可以使用Math.Floor执行此操作,但也可以将数字转换为整数以实现相同的效果:

(int)TimeRemaining.TotalMinutes

关于秒,我不知道为什么会出错。我认为这是因为你的剩余时间实际上可能是消极的。错误似乎不在您发布的代码中。