同步两个日期时间

Sync two DateTimes

我想将远程设备的时钟与另一台设备同步,而不是不断请求远程设备的时间。

我想知道我的设备和远程设备上的时间之间的差异,所以我可以将远程设备的时间戳添加到事件中。

目前我的解决方案是:获取远程设备的时间,通过比较计算差值。

例如:

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,这样我就可以随时重新计算远程设备上的时间(包括日月年差) .

为什么你不使用 difference 作为 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;

您在提出问题时已经在问题中发布了更简单的答案:DateTime difference = DateTimeRemoteDevice - DateTimeMyDevice;,除了您指定的 return 值是 DateTime 而不是 TimeSpan .这应该可以解决问题:

TimeSpan difference = getDateTimeOfRemoteDevice() - DateTime.Now;

保存 difference 后,您现在可以随时模拟远程设备时间:

DateTime remoteTimestamp = DateTime.Now + difference;

如果您真的想知道 difference 表示多少天、小时、分钟等,TimeSpan class 有一些很好的属性可以帮助您解决这个问题:

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

输出

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

即使在接受答案后,您的评论向我表明您不了解 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

如果您想知道这两个 DateTime 之间的时间差,只需将它们相减即可:

TimeSpan negativeTimeSpan = myDevice - remoteDevice;
//negativeTimeSpan is: "-12.00:00:00"

TimeSpan positiveTimeSpan = laterDate - earlyDate;
//positiveTimeSpan  is: "12.00:00:00"

您现在不需要任何其他代码。 TimeSpan 甚至具有名为 TotalDaysTotalHours 等的属性,它们可以向您显示以不同单位衡量的时间差异。

我为您制作了一个 fiddle here,您可以在其中看到所有内容。

这是一个基于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 ");