我有一个特定的问题,我一直试图解决,我认为我有正确的部分 - 我只是错误地将它们放在一起。它可能更像是一个数学问题,而不是编码问题。
所以基本上我希望能够做到的是找到“现在”在任意的经常性时间段内(例如,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支持的数学运算,或者在这个例子中我应该使用哪些数学运算。
感谢。
答案 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);
您可以输出过去迭代的数量,从最后一次开始的当前时间量以及下一次的持续时间。