将 NTP 时间戳转换为 utc

发布于 2024-10-20 15:05:16 字数 80 浏览 5 评论 0原文

将 NTP 时间戳转换为 utc 的最简单方法是什么。我知道它是 NTP 格式,我可以将其转换为任何其他格式。

谢谢。 鲍勃.

Whats the easiest way to convert an NTP timestamp to utc. I know it's in NTP, I can convert it into any other format.

Thanks.
Bob.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情绪操控生活 2024-10-27 15:05:16

正如 rene 指出的那样,NTP 时间戳由整数和小数部分组成。整数部分表示自基准时间(即 1900 年 1 月 1 日)以来的秒数。小数部分表示秒中小数单位的数量(单位为 1/((2^32)-1))。

此外,时间表示为 UTC。

因此,如果您的 NTP 时间戳为 14236589681638796952。NTP 是一个 64 位无符号定点数。我们可以说:

UInt64 ntpTimestamp = 14236589681638796952;

高 32 位由下式给出:

UInt32 秒 = (UInt32)((ntpTimestamp >> 32) & 0xFFFFFFFF);

低 32 位由下式给出:

UInt32 分数 = (UInt32)(ntpTimestamp & 0xFFFFFFFF);

以秒为单位的数字等于最重要的单词,或者在本例中:
秒 == 3314714339

可以使用以下计算从分数中计算出毫秒数:

Int32 毫秒 = (Int32)(((Double)fraction / UInt32.MaxValue) * 1000);

在本例中为 12。

因此,DateTime 值由以下公式得出:

DateTime BaseDate = new DateTime(1900, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

DateTime dt = BaseDate.AddSeconds(秒).AddMilliseconds(毫秒);

因此,NTP 时间戳 14236589681638796952 等于 2005 年 1 月 14 日 17:58:59,比 UTC 晚 12 毫秒。

As rene pointed out the NTP timestamp is made up of an integer and a fractional part. The integer part represents the number of seconds since base time, which is 1st Jan 1900. The fractional part represents the number of fractional units (a unit is 1/((2^32)-1)) in the second.

Also, the time representation is UTC.

Therefore, if you have an NTP Timestamp of say 14236589681638796952. NTP is a 64-bit unsigned fixed-point number. We can say:

UInt64 ntpTimestamp = 14236589681638796952;

The high 32 bits are given by:

UInt32 seconds = (UInt32)((ntpTimestamp >> 32) & 0xFFFFFFFF);

And the low 32 bits are are given by:

UInt32 fraction = (UInt32)(ntpTimestamp & 0xFFFFFFFF);

The number in seconds is equal to the most significant word or in this case:
seconds == 3314714339

The number of milliseconds can be calculated from the fraction using this calculation:

Int32 milliseconds = (Int32)(((Double)fraction / UInt32.MaxValue) * 1000);

Which is 12 in this case.

Thus the DateTime value is yielded from:

DateTime BaseDate = new DateTime(1900, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

DateTime dt = BaseDate.AddSeconds(seconds ).AddMilliseconds(milliseconds);

Therefore the NTP Timestamp of 14236589681638796952 is equal to the 14th Jan 2005 at 17:58:59 and 12 milliseconds UTC.

看轻我的陪伴 2024-10-27 15:05:16

对我来说,这工作可靠:

#define NTP_TIMESTAMP_DIFF     (2208988800)    // 1900 to 1970 in seconds
#define NTP_MAX_INT_AS_DOUBLE  (4294967295.0)  // Max value of frac

  // take care of the endianness
  reply_pkt.tx_time_sec = ntohl( reply_pkt.tx_time_sec ) ;
  reply_pkt.tx_time_frac = ntohl( reply_pkt.tx_time_frac ) ;
  // parse
  time_t tx_time = ( time_t ) ( reply_pkt.tx_time_sec - NTP_TIMESTAMP_DIFF );
  double frac = ((double)reply_pkt.tx_time_frac) / NTP_MAX_INT_AS_DOUBLE ; // 2^32 -1

  struct tm *tm = gmtime(&tx_time) ;
  char ts[49];
  strftime(ts,48,"[%Y-%m-%d %H:%M:%S]",tm);
  printf("NTP query: reply was %s\n",ts);

  ntp_time_seconds = ((double)tx_time) + frac ;

This works reliably, for me:

#define NTP_TIMESTAMP_DIFF     (2208988800)    // 1900 to 1970 in seconds
#define NTP_MAX_INT_AS_DOUBLE  (4294967295.0)  // Max value of frac

  // take care of the endianness
  reply_pkt.tx_time_sec = ntohl( reply_pkt.tx_time_sec ) ;
  reply_pkt.tx_time_frac = ntohl( reply_pkt.tx_time_frac ) ;
  // parse
  time_t tx_time = ( time_t ) ( reply_pkt.tx_time_sec - NTP_TIMESTAMP_DIFF );
  double frac = ((double)reply_pkt.tx_time_frac) / NTP_MAX_INT_AS_DOUBLE ; // 2^32 -1

  struct tm *tm = gmtime(&tx_time) ;
  char ts[49];
  strftime(ts,48,"[%Y-%m-%d %H:%M:%S]",tm);
  printf("NTP query: reply was %s\n",ts);

  ntp_time_seconds = ((double)tx_time) + frac ;
半岛未凉 2024-10-27 15:05:16

尝试这样的事情吗?我不确定“自 1900 年 1 月 1 日以来的秒数”的格式,但您可以根据需要进行修改。

long ntp = 3490905600; 
DateTime start = new DateTime(1900, 1, 1);
DateTime dt = start.AddSeconds(ntp);

Console.WriteLine(dt.ToString());
Console.WriteLine(dt.ToUniversalTime().ToString()); 

Try something like this? I'm not sure on the format of that 'seconds since Jan 1 1900', but you can modify as you see fit.

long ntp = 3490905600; 
DateTime start = new DateTime(1900, 1, 1);
DateTime dt = start.AddSeconds(ntp);

Console.WriteLine(dt.ToString());
Console.WriteLine(dt.ToUniversalTime().ToString()); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文