同步两个日期时间
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 甚至具有名为 TotalDays
和 TotalHours
等的属性,它们可以向您显示以不同单位衡量的时间差异。
我为您制作了一个 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 ");
我想将远程设备的时钟与另一台设备同步,而不是不断请求远程设备的时间。
我想知道我的设备和远程设备上的时间之间的差异,所以我可以将远程设备的时间戳添加到事件中。
目前我的解决方案是:获取远程设备的时间,通过比较计算差值。
例如:
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 甚至具有名为 TotalDays
和 TotalHours
等的属性,它们可以向您显示以不同单位衡量的时间差异。
我为您制作了一个 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 ");