【问题标题】:How to tick based on external time in C#?如何在 C# 中根据外部时间打勾?
【发布时间】:2020-09-12 22:57:04
【问题描述】:

有这个 API 可以在调用时为我提供远程服务器的时间。这是该 API 的响应 JSON:

{
    hour: 12,
    minute: 2,
    second: 20,
    msFormat: "/Date(1590478340707)/"
}

此时间与运行我的代码的服务器不同步。根据远程服务器的时间,我的代码需要毫秒精度。

我想调用该服务器的另一个 API,完全基于相对于该服务器的某个时间。因此我不能使用我自己服务器的DateTime.Now,因为它们不同步。我的服务器和远程服务器是同一年、同一月、同一天,但有时它们甚至可能会关闭几个小时。

我看到了this question,但答案假定我可以访问该服务器上的 JavaScript 代码以获取时间。我不。我也看到了this question,但它是关于将我自己的客户的时间发送到我的服务器。正如我所说,我无权创建 JavaScript 的日期时间。我只能访问上面显示的数据。

现在我需要:

  1. 按原样解析这次,精确到毫秒
  2. 根据这个时间打勾,这样我就可以在某个时间点准确地做某事,相对于它

我想试试new DateTime(year, month, day, hour, minute, second, millisecond),但我没有毫秒数(它在最后一个名为msFormat 的参数中,直到我提取它才知道,这是我不知道的知道)。

我尝试了new DateTime(1970, 01, 01).AddMilliseconds(1590478340707),它给了我一个错误的时间,因为我知道即使基于远程服务器的时间它也是关闭的。

我也试过new System.Timers.Timer(1).Elapsed += HandleTimeBasedOnRemoteServerTime;。但是现在我不知道如何知道那个服务器的时间,因为我不能使用DateTime.Now

你能帮忙吗?

【问题讨论】:

  • 使用StopWatchLink
  • “我需要毫秒精度” - 有网络延迟这样的东西,所以我想你不能那么精确。也许NTP 可以帮助你?
  • /Date(1590478340707)/ 是 JSON 格式的日期时间,但与小时/分钟/秒值不匹配

标签: c# datetime


【解决方案1】:

最好的解决方案是确保两台服务器都通过 ntp 或类似协议同步它们的时钟,这是别人的问题,所以你可以简单地假设时钟是正确的。

如果由于某种原因您无法做到这一点,那么应该可以将 ntp 的源代码重新用作库,并根据您可用的数据构造虚假消息。但是有这么多抽象层,你的时间估计的准确性可能永远不会达到 1 毫秒。

我的服务器和远程服务器是同一年、同一月、同一天,但有时它们甚至可能会关闭几个小时。

您确定服务器不只是在不同的时区吗?始终确保您以 UTC 计算时间,即使您必须在本地时区显示/编辑值。为此,DateTimeOffset 是一种更好的数据类型,因为它可以正确保留源时区信息。

回到你失败的例子;

new DateTime(1970, 01, 01)

当您应该明确使用 UTC 时,该构造函数将保留 Kind 未指定。使用 ticks 构造函数会更简单;

new DateTime(1590478340707 * 1000, DateTimeKind.Utc);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多