在我的主要方法中,我一直在检查给定时间是否等于当前时间。但是我的代码似乎失败了。这是Windows窗体应用程序,而不是控制台应用程序。不尝试将字符串转换为时间跨度,需要某种方式来检查两次是否相等。
static void Main()
{
TimeSpan start = TimeSpan.Parse("10:09:00");
while (true)
{
TimeSpan now = DateTime.Now.TimeOfDay;
if (now == start)
{
Debug.WriteLine("Fount at " + now + " " + start);
Environment.Exit(1);
}
Debug.WriteLine("Running Loop at " + now + " "+start);
}
}
我尝试将第一行更改为
TimeSpan start = TimeSpan.Parse("10:09:00:0000000");
这似乎也不起作用,有人可以建议我更好的方法吗?
答案 0 :(得分:2)
您的代码无法正常工作,因为您比较了不同的时间跨度,并且当添加小数毫秒时,它们不太可能匹配。
您可以使用以下代码段来比较时间:
TimeSpan start = new TimeSpan(11, 49, 0);
while (true)
{
TimeSpan now = DateTime.Now.TimeOfDay;
if (Math.Abs((now - start).TotalMilliseconds)<1000)
{
Debug.WriteLine("Found at " + now + " " + start);
Environment.Exit(1);
}
Debug.WriteLine("Running Loop at " + now + " " + start);
}
答案 1 :(得分:2)
您的问题可能是毫秒
您还可以使用扩展名进行修整,这样可以将时间截短到第二秒
public static class Extensions
{
public static DateTime TrimMilliseconds(this DateTime dt)
{
return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0, dt.Kind);
}
}
答案 2 :(得分:2)
您的“开始”值还可以,问题是TimeOfDay
的精度要比分钟要高得多。您需要以某种方式将值截断到分钟。
这是一种您可以做到的方式:
var now = TimeSpan.FromSeconds(Math.Floor(DateTime.Now.TimeOfDay.TotalSeconds));
TotalSeconds将返回一个非整数值(即它将毫秒作为小数部分),因此我们采用该值,对其进行下限以删除小数部分,然后将其转换回秒-现在没有任何短于此的值一秒钟。
当然,您可以根据需要将“秒”切换为分钟,小时等。