给定开始时间和结束时间的时间间隔问题 c#
Problem with time intervals with given start time and end time c#
我正在尝试开发一个简单的应用程序来提高我的 c# 技能,但是我对 c# 的时间功能很陌生,
我需要的:
我有 3 个文本框,其中包含开始时间、结束时间和时间间隔。
假设用户输入 7:00 AM,12:00 PM,60 分钟后它将存储在数据表中并将其添加到列表框中。
7:00上午
上午 8:00
上午 9:00
上午 10:00
上午 11:00
12:00上午
当前方法:
我想我需要使用 DateTime.AddMinutes(interval)
但我将如何达到如果到达结束时间就会停止的逻辑?使用 DateTime 方法?我真的不知道该用什么,我看到了 TimeRange、TimeSpan 等。
您可以使用 TimeSpan
和布尔逻辑运算符来测试 currentTime
是否小于您的 endTime
。
下面是示例代码。
TimeSpan startTime;
int interval;
TimeSpan tInterval = new TimeSpan(interval, 0, 0);
TimeSpan endTime;
TimeSpan currentTime = startTime;
while( (currentTime = startTime + tInterval) <= endTime)
{
// add currentTime to list box
}
TimeSpan和DateTime可以一起使用(分别计算和打印)
TimeSpan start = DateTime.Parse("7:00 AM").TimeOfDay;
TimeSpan end = DateTime.Parse("12:00 PM").TimeOfDay;
TimeSpan interval = new TimeSpan(0, 60, 0);
// If Start is bigger than end, Add a day to the end.
if (start > end)
end = end.Add(new TimeSpan(1, 0, 0, 0));
while (true)
{
Console.WriteLine((new DateTime() + start).ToString("hh:mm tt"));
start = start.Add(interval);
if (start > end)
break;
}
输出看起来像这样,
07:00 AM
08:00 AM
09:00 AM
10:00 AM
11:00 AM
12:00 PM
这应该解决结束时间比开始时间 "earlier" 的问题:
private static void TestTimeSpan()
{
int minutes = 60;
var interval = new TimeSpan(0,minutes,0);
TimeSpan start = DateTime.Parse("7:00 PM").TimeOfDay;
TimeSpan end = DateTime.Parse("1:00 AM").TimeOfDay;
//End of input data--start of solution
var diffSpan = end - start;
var diffMinutes = diffSpan.TotalMinutes > 0 ? diffSpan.TotalMinutes : diffSpan.TotalMinutes + (60 * 24);
var myTimeList = new List<TimeSpan>();
for(int i = 0; i < diffMinutes + minutes; i += minutes)
{
myTimeList.Add(start);
start = start.Add(interval);
}
myTimeList.ForEach(x => Console.WriteLine((new DateTime() + x).ToString("hh:mm tt")));
}
编辑
根据两个输入时间创建一个时间值序列,并且一个间隔是直截了当的,直到 "start time" 早于 "end time",因为只是检查 "end time" 是否大于开始时间立即使您的算法失败。
这段代码利用了一天只有 24 小时的事实。由于间隔值以分钟为单位给出,我们可以使用它将这些分钟划分为 "steps" 时间。此代码继续逐步遍历每个时间间隔并捕获该步骤的时间并将其保存在 List
of TimeSpan
中(捕获的值可以很容易地成为 string
类型--格式如预期的)。
这里的技巧是当 "end time" 早于 "start time" 时,我们得到一个负值 TimeSpan
,然后用于计算 "end time" 的步骤第二天。这是 (60 * 24) [60 分钟 x 24 小时] 部分使用三元运算符创建正确的 "diffMinutes" 的地方。
之后,代码简单地遍历 List
"myTimeList" 以将格式化的 TimeSpan
写入控制台。然而,这个 'List' 只是一个可移植的集合,可以发送到你代码中的任何地方来做任何需要的事情。
还有很多其他的解决方案,这个对我来说似乎很简单。
我正在尝试开发一个简单的应用程序来提高我的 c# 技能,但是我对 c# 的时间功能很陌生,
我需要的:
我有 3 个文本框,其中包含开始时间、结束时间和时间间隔。
假设用户输入 7:00 AM,12:00 PM,60 分钟后它将存储在数据表中并将其添加到列表框中。
7:00上午
上午 8:00
上午 9:00
上午 10:00
上午 11:00
12:00上午
当前方法:
我想我需要使用 DateTime.AddMinutes(interval)
但我将如何达到如果到达结束时间就会停止的逻辑?使用 DateTime 方法?我真的不知道该用什么,我看到了 TimeRange、TimeSpan 等。
您可以使用 TimeSpan
和布尔逻辑运算符来测试 currentTime
是否小于您的 endTime
。
下面是示例代码。
TimeSpan startTime;
int interval;
TimeSpan tInterval = new TimeSpan(interval, 0, 0);
TimeSpan endTime;
TimeSpan currentTime = startTime;
while( (currentTime = startTime + tInterval) <= endTime)
{
// add currentTime to list box
}
TimeSpan和DateTime可以一起使用(分别计算和打印)
TimeSpan start = DateTime.Parse("7:00 AM").TimeOfDay;
TimeSpan end = DateTime.Parse("12:00 PM").TimeOfDay;
TimeSpan interval = new TimeSpan(0, 60, 0);
// If Start is bigger than end, Add a day to the end.
if (start > end)
end = end.Add(new TimeSpan(1, 0, 0, 0));
while (true)
{
Console.WriteLine((new DateTime() + start).ToString("hh:mm tt"));
start = start.Add(interval);
if (start > end)
break;
}
输出看起来像这样,
07:00 AM
08:00 AM
09:00 AM
10:00 AM
11:00 AM
12:00 PM
这应该解决结束时间比开始时间 "earlier" 的问题:
private static void TestTimeSpan()
{
int minutes = 60;
var interval = new TimeSpan(0,minutes,0);
TimeSpan start = DateTime.Parse("7:00 PM").TimeOfDay;
TimeSpan end = DateTime.Parse("1:00 AM").TimeOfDay;
//End of input data--start of solution
var diffSpan = end - start;
var diffMinutes = diffSpan.TotalMinutes > 0 ? diffSpan.TotalMinutes : diffSpan.TotalMinutes + (60 * 24);
var myTimeList = new List<TimeSpan>();
for(int i = 0; i < diffMinutes + minutes; i += minutes)
{
myTimeList.Add(start);
start = start.Add(interval);
}
myTimeList.ForEach(x => Console.WriteLine((new DateTime() + x).ToString("hh:mm tt")));
}
编辑
根据两个输入时间创建一个时间值序列,并且一个间隔是直截了当的,直到 "start time" 早于 "end time",因为只是检查 "end time" 是否大于开始时间立即使您的算法失败。
这段代码利用了一天只有 24 小时的事实。由于间隔值以分钟为单位给出,我们可以使用它将这些分钟划分为 "steps" 时间。此代码继续逐步遍历每个时间间隔并捕获该步骤的时间并将其保存在 List
of TimeSpan
中(捕获的值可以很容易地成为 string
类型--格式如预期的)。
这里的技巧是当 "end time" 早于 "start time" 时,我们得到一个负值 TimeSpan
,然后用于计算 "end time" 的步骤第二天。这是 (60 * 24) [60 分钟 x 24 小时] 部分使用三元运算符创建正确的 "diffMinutes" 的地方。
之后,代码简单地遍历 List
"myTimeList" 以将格式化的 TimeSpan
写入控制台。然而,这个 'List' 只是一个可移植的集合,可以发送到你代码中的任何地方来做任何需要的事情。
还有很多其他的解决方案,这个对我来说似乎很简单。