【问题标题】:Create 75-Mins timeblock for multiple DateTimes of a day为一天中的多个 DateTimes 创建 75 分钟的时间块
【发布时间】:2018-06-22 06:03:16
【问题描述】:

我正在开发一个股票市场软件。我每 5 分钟 有一支蜡烛。 So whenever a time-frame of say 30 minutes is selected, what we do is -

long val = (long)(D * 24 * 60) / 30; //D is datetime of candle converted in OA date in double.
//The above code never create problem as (24*60)%30 == 0.

上面的行每半小时为块 i 返回相同的值。 e.蜡烛 10:35, 10:40.....11:00。有了它,我们可以很容易地找出半小时的时间块,无论何时 val 被更改。

现在,我们有一个挑战以同样的方式实现 75-Mins 的块。我们的市场从 9:15 开始,到 3:30 结束。假设需要计算 75-Mins 的日期是 22-9-2018. 为此我需要正好有 5 根低于时间的蜡烛 -

  1. 22-9-2018 10:30(9:15 到 10:30 = 75 分钟)
  2. 22-9-2018 11:45
  3. 22-9-2018 1:00
  4. 22-9-2018 2:15
  5. 22-9-2018 3:30

我需要与上面提到的相同类型的代码,它将为这五个块计算相同的值。

我发现的问题是,如果我们从 12:00 开始 75,那么市场时间的块将在 8:45 到 10:00 而我们要求从 9:15到 10:30 第一块。

另外,(24*60)%75 = 15,所以15分钟每天的差异也会影响第二天的计算。

更新 -

为了澄清这个问题,对于 10:35 到 11:45 的一段,我将有 10:35、10:40、10:45 ...... 11:45 这样的蜡烛。对于所有这些日期时间,我需要一个相同的数字返回值。 11:50 的蜡烛一来,返回的数值就会改变,我的新 75 分钟块将开始。它会在 1:00 之前给出相同的值。

【问题讨论】:

  • 您可以为特定的日期和时间声明DateTime,并在while循环中使用与日期相关的函数DateTime.AddMinutesDateTime.ToOADate
  • @bradbury9 无法清楚地理解您。你能解释一下吗?
  • 检查 Reza 的答案,这是我的建议,使用 linq 代替 while 循环

标签: c# .net datetime


【解决方案1】:

您可以像这样使用循环或 linq 查询:

var startTime = new DateTime(2018, 09, 22, 9, 15, 0);
var times = Enumerable.Range(1, 5).Select(x => startTime.AddMinutes(x * 75)).ToList();

示例

这里还有另一个关于如何拆分日期范围的示例。在以下示例中,我也将开始时间作为结果的一部分:

IEnumerable<DateTime> Split(DateTime start, DateTime end, int minutes)
{
    if (minutes <= 0)
        throw new ArgumentException(
            $"'{nameof(minutes)}' should be greater than 0.",
            nameof(minutes));
    var result = start;
    while (result <= end)
    {
        yield return result;
        result = result.AddMinutes(minutes);
    }
}

这是用法:

var startTime = new DateTime(2018, 09, 22, 9, 15, 0);
var endTime = startTime.AddHours(7);
var times = Split(startTime, endTime, 75).ToList(); 

【讨论】:

  • 遵守“我们使用 OADates”,您可以.AddMinutes(x * 75).ToOADate()
  • 使用Split 方法。
  • 您正在检查(minutes == 0),但返回"should be greater than 1 minute"。我宁愿建议像"must not be zero" 这样的东西来反映支票。此外,负值和 endstart 之前可能会出现其他问题。
  • @Corak 是的,我应该检查&lt;=0 和消息Greater than 0,但是开始之前的结束没有任何问题,它返回一个空结果。感谢您的评论,尽管验证不是问题的重点。它只是在那里向 OP 展示他们需要一些验证。如有明显错误,与作者的想法没有冲突,请随时更正代码。
  • @RezaAghaei 你的回答帮助了我。不完全是我想要的方式。但我能够解决我的问题。谢谢你。
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2017-08-26
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多