我希望将远程设备的时钟与其他设备同步,而无需连续请求远程设备的时间。
我想知道设备上的时间与远程设备之间的区别,因此我可以将远程设备的时间戳添加到事件中。
我到目前为止的解决方案是:获取远程设备的时间并通过比较来计算差异。
例如:
DateTime myDevice = DateTime.Now();
DateTime remoteDevice = getDateTimeOfRemoteDevice();
//Compare the clocks and keep the difference...
int daydiff = myDevice.Day - remoteDevice.Day
int monthdiff = myDevice.Month - RemoteDevice.Month
// ...and so on un till i have everything separated.
我的问题是:有更好的方法吗?
也许类似于:DateTime difference = DateTimeRemoteDevice - DateTimeMyDevice;
,答案是:00/00/00 00:01:50
,这样我就可以随时重新计算远程设备上的时间(包括日月和年差)。 / p>
答案 0 :(得分:2)
当您提议时,您已在问题中发布了更简单的答案:DateTime difference = DateTimeRemoteDevice - DateTimeMyDevice;
,除非您指定的返回值为DateTime
而非TimeSpan
。这应该可以解决问题:
TimeSpan difference = getDateTimeOfRemoteDevice() - DateTime.Now;
保存此difference
后,您现在可以随时模拟远程设备时间:
DateTime remoteTimestamp = DateTime.Now + difference;
如果您真的想知道difference
代表了多少天,小时,分钟等,TimeSpan
类有一些很好的属性来帮助解决这个问题:
Console.WriteLine($"Local time .... {DateTime.Now}");
Console.WriteLine($"Remote time ... {remoteTimestamp}");
Console.WriteLine(new string('-', Console.WindowWidth));
Console.Write("Remote time is different by: ");
Console.Write($"{difference.Days} days, ");
Console.Write($"{difference.Hours} hours, ");
Console.WriteLine($"{difference.Minutes} minutes;");
Console.WriteLine($"or a total of {difference.TotalMinutes} minutes.");
Console.WriteLine("\nDone!\nPress any key to exit...");
Console.ReadKey();
<强>输出强>
当然,如果远程时间小于当前时间,这些数字将变为负数:
答案 1 :(得分:0)
为什么你不会使用差异作为TimeSpan?
class TimeSpan{
public double TotalMilliseconds { get; }
public double TotalHours { get; }
public double TotalDays { get; }
public int Seconds { get; }
public int Minutes { get; }
public int Milliseconds { get; }
public int Hours { get; }
public int Days { get; }
public long Ticks { get; }
public double TotalMinutes { get; }
public double TotalSeconds { get; }
...
}
只需减去两个日期:
TimeSpan outresult = d2.Subtract(d1);
或只是
TimeSpan outresult = d2 - d1;
答案 2 :(得分:0)
即使在接受答案后,您的评论也向我表明您不明白TimeSpan究竟是什么。
在您的情况下,您有两个日期:
DateTime myDevice = new DateTime(2017, 12, 31); //This would be DateTime.Now
DateTime remoteDevice = new DateTime(2018, 1, 12); //This comes from a method
如果你想知道这两个DateTimes之间的时间差异,只需从另一个中减去一个:
TimeSpan negativeTimeSpan = myDevice - remoteDevice;
//negativeTimeSpan is: "-12.00:00:00"
TimeSpan positiveTimeSpan = laterDate - earlyDate;
//positiveTimeSpan is: "12.00:00:00"
您现在不需要任何其他代码。 TimeSpan甚至还有一个名为TotalDays
和TotalHours
等属性,用于显示时间的差异,以不同的单位衡量。
我让你成为一个小提琴here,你可以在其中看到一切。
答案 3 :(得分:0)
以下是基于age calculation
的简单示例 DateTime myDevice = DateTime.Now;
DateTime remoteDevice = new DateTime(2000, 05, 05, 0, 0, 0); //for example
TimeSpan difference = myDevice - remoteDevice; // use timespan for substraction
对于输出,您可以使用timespan
属性
Console.WriteLine("Remote time is diffrent by "+difference.Days +" days "+difference.Hours+", hours and"+difference.Minutes+" minutes");
但如果您希望在数年或数月内外出,则需要转换为datetime
。
// converting
DateTime result = DateTime.MinValue + difference;
// Min value is 01/01/0001
// subtract our addition or 1 on all components to get the actual date.
int years = result.Year - 1;
int months = result.Month - 1;
//you can continiue
Console.WriteLine("Remote time is diffrent by " + years + " years and " + months + " months ");