【问题标题】:Problem with time intervals with given start time and end time c#给定开始时间和结束时间的时间间隔问题c#
【发布时间】:2020-05-19 03:49:04
【问题描述】:

我正在尝试为我的 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),但是如果它到达结束时间,我将如何到达它的逻辑?使用日期时间方法?我对使用什么感到很困惑,我看到了 TimeRange、TimeSpan 等。

【问题讨论】:

  • 如果用户输入 8:00 PM, 1:00 AM, 60 分钟,结果应该是什么?
  • @barn 那么它应该是这样的 8:00 9:00 10:00 11:00 12:00 01:00 AM
  • @Barns 你是对的!它没有输出正确的结果...我没有标记答案。
  • 从 OP 分析 cmets 后发现 OP 已经实现了一些东西。我认为 OP 应该提供他部分实施的一些细节。

标签: c# time intervals


【解决方案1】:

可以同时使用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

MS Documentation on TimeSpan

【讨论】:

  • 嗨@jawad thx 对于出色的逻辑和知识,可以说我不想只在控制台中输出它,并且想将每个值存储在数据表中并将其添加到列表框中,是这可能吗?
  • 我要说的是,您可以在循环中获取一个变量,然后可以将其保存到 DB 或您想要的表单中。打印在其后面显示一个变量和值。
  • 尝试输入 8:00 PM 和 01:00 AM,结果 ddnt 匹配所需的输出
  • 这是我能得到的最接近的答案,我知道如果用户输入 PM 到 AM,我可以设置一个例外,因为没有日期选项,只有时间选项。
  • 如果 start 大于 end 开始,则在末尾添加一天,以便循环经过两天的小时(而不是在一天内)。请参阅上面帖子中的 if 语句。
【解决方案2】:

您可以使用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
}

【讨论】:

    【解决方案3】:

    这应该解决结束时间比开始时间“早”的问题:

        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")));
        }
    




    编辑
    根据两个输入时间和间隔创建时间值序列,直到“开始时间”早于“结束时间”,因为仅检查“结束时间”是否大于开始时间失败你的算法立即。

    此代码利用了一天只有 24 小时这一事实。由于间隔值以分钟为单位,我们可以使用它将这些分钟划分为时间的“步长”。此代码继续逐步遍历每个时间间隔并捕获该步骤的时间并将其保存在TimeSpanList 中(捕获的值可以很容易地为string 类型——根据需要格式化)。

    这里的技巧是当“结束时间”早于“开始时间”时,我们会得到一个负数TimeSpan,然后用它来计算第二天到“结束时间”的步数。这就是 (60 * 24) [60 minutes x 24 hrs] 部分使用三元运算符创建正确的“diffMinutes”的地方。

    之后,代码简单地遍历 List "myTimeList" 以将格式化的 TimeSpan 写入控制台。然而,这个“列表”只是一个可移植的集合,可以在您的代码中的任何地方发送以执行任何需要的操作。

    还有很多其他解决方案,对我来说,这个似乎很简单。

    【讨论】:

    • 谢谢!我确实尝试了您的解决方案,但是它一直迭代到下午 1 点,但情况并非如此,我认为这是行为,因为前几天晚上 7 点到凌晨 1 点?一个问题可以说我想将每个“时间”添加到数据表中,是否可以代替列表?
    • 当然,您只需要创建数据结构并将值添加到循环的每次迭代中的行中,或者只需使用“myTimeList”并将值迭代到查询中。我需要有关您的要求的更多信息,但应该没问题
    • 基本上,输出是在可消耗的结构中创建的。您可以使用该输出来创建任何其他必要的数据结构。
    • 啊!我用 "diffMinutes" 纠正了错误。在我试图在发布之前让它更优雅的尝试中,我犯了一个致命的错误。现在应该更正了祝你好运!
    • yours 可能是这里最好的答案,因为它也处理异常,但我可以请求一些东西吗?因为我只是一个开始@c#,你介意解释一些代码行吗?赞赏!
    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多