0

全部,

当客户登录我的网站时,我想显示在登录链接超时之前还剩多少时间。

由于某种原因,在 C# 中使用 TimeSpan 结构,我无法弄清楚如何执行此任务:

TimeSpan diff = (DateTime.Now - orderDate   );

当客户登录时,我想向客户展示他/她还有多少时间可以登录......“您还有 3 小时 33 分钟,直到此链接超时。” ...“在此链接超时之前,您有 2 小时 25 分钟的时间”等。

一旦达到 4 小时,当客户登录时,我将把他/她重定向到一个抱歉...链接已超时页面。

所以一些伪代码可能是......

if (diff.Hours >= 4)
{
response.redirect("log_in_timed_out.aspx");
}
else
{
lblTimeRemaining.Text = "You have " + diff.Hours + " hours and " + diff.Minutes + " minutes remaining until the link times out.";
}

这个伪代码使小时和分钟计数增加而不是减少到 0。所以我登录并说你有 1 小时 33 分钟、2 小时 12 分钟等,因为 TimeSpan 给了我两个日期之间的差异。我希望它倒计时到 0,例如 3 小时 23 分钟、2 小时 15 分钟、1 小时 5 分钟等。

我如何才能显示客户每次使用 TimeSpan 结构登录并倒计时到 0 时还剩多少时间?

感谢您的任何反馈。

4

2 回答 2

3

我建议将所有 internal DateTimes 保留在 中UTC,并且仅转换为本地时间以进行显示。所以我使用DateTime.UtcNow而不是DateTime.Now假设orderTime也是UTC。

我首先计算链接到期的时间,然后计算到那时还剩多少时间。

DateTime expirationTime = orderTime.AddHours(4);
TimeSpan timeRemaining = expirationTime - DateTime.UtcNow;
if(timeRemaining<TimeSpan.Zero)
  Error("Expired");
else
  Write("Remaining {0} hours {1} minutes",timeRemaining.Hours, timeRemaining.Minutes);

为了更好的可测试性,不要调用DateTime.UtcNow/.Now内联,而是传递值可能很有用。但是由于我不了解您周围的代码和架构,所以我采用了简单的方法。

于 2013-04-12T08:57:18.983 回答
1

像这样,既然你知道限制是 4 小时,把 4 小时加到 orderDate 中,然后只取 UtcNow 之间的差,条件应该变成.....

TimeSpan diff = (orderDate.AddHours(4) - DateTime.UtcNow);


if (diff < TimeSpan.Zero)
{
    response.redirect("log_in_timed_out.aspx");
}
else
{
    lblTimeRemaining.Text = "You have " + diff.Hours + " hours and " + diff.Minutes + " minutes remaining until the link times out.";
}
于 2013-04-12T08:56:08.110 回答