同步两个日期时间

时间:2018-02-01 20:17:38

标签: c# datetime synchronization clock

我希望将远程设备的时钟与其他设备同步,而无需连续请求远程设备的时间。

我想知道设备上的时间与远程设备之间的区别,因此我可以将远程设备的时间戳添加到事件中。

我到目前为止的解决方案是:获取远程设备的时间并通过比较来计算差异。

例如:

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>

4 个答案:

答案 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();

<强>输出

enter image description here

当然,如果远程时间小于当前时间,这些数字将变为负数:

enter image description here

答案 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甚至还有一个名为TotalDaysTotalHours等属性,用于显示时间的差异,以不同的单位衡量。

我让你成为一个小提琴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 ");