如何在经常性的时间间隔内获取当前时间点?

时间:2018-01-05 13:16:49

标签: c#

我有一个特定的问题,我一直试图解决,我认为我有正确的部分 - 我只是错误地将它们放在一起。它可能更像是一个数学问题,而不是编码问题。

所以基本上我希望能够做到的是找到“现在”在任意的经常性时间段内(例如,43分钟),给定一个已知的DateTime,这个时期重现。所以你有一个锚点,从那个锚点,你知道这个时期的每43分钟重新开始,在当前时期“现在”在哪里?

我确定它涉及除法和/或模数,并且可能使用锚点进行减法...所以我一直在玩这个代码,但它没有给我我想要的结果:

using System;

public class Program
{
    public static void Main()
    {
        TimeSpan interval = new TimeSpan(0, 43, 0);
        DateTime anchor = new DateTime(2018, 1, 5, 7, 0, 49);
        DateTime now = DateTime.Now;

        TimeSpan left = new TimeSpan((now - anchor).Ticks % interval.Ticks);

        Console.WriteLine(left);
    }
}

有人能告诉我我在这里失踪的那件作品吗?我不完全确定DateTime支持的数学运算,或者在这个例子中我应该使用哪些数学运算。

感谢。

2 个答案:

答案 0 :(得分:0)

假设您的主播始终在过去,您可以使用此代码。它将打印完成期间的数量以及从上一期间开始经过的时间

var anchor = new DateTime(2018, 1, 5, 13, 20, 17);
var interval = new TimeSpan(0, 43, 0);
var now = DateTime.Now;

var seconds = (ulong) (now - anchor).TotalSeconds;
var intervalSeconds = (ulong) interval.TotalSeconds;

var cycles = seconds / intervalSeconds;
var momentInInterval = TimeSpan.FromSeconds(seconds % intervalSeconds);

Console.WriteLine($"{cycles} cycles passed. {momentInInterval} passed from last period");

我正在使用TotalSeconds,您可以将其更改为TotalMilliseconds以便更准确

答案 1 :(得分:0)

如果你想知道下一次迭代需要多少时间,你可以做这样的事情

TimeSpan interval = new TimeSpan(0, 43, 0);
DateTime anchor = new DateTime(2018, 1, 5, 7, 0, 49);

var iterations = DateTime.Now.Subtract(anchor).Ticks / interval.Ticks;

DateTime current = anchor;

for(var i = 0; i < iterations; i++)
    current = current.AddTicks(interval.Ticks);

var untilNext = DateTime.Now.Subtract(current);

Console.Write(untilNext);

您可以输出过去迭代的数量,从最后一次开始的当前时间量以及下一次的持续时间。