Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 将NTP时间戳转换为utc_C# 4.0_Ntp - Fatal编程技术网

C# 4.0 将NTP时间戳转换为utc

C# 4.0 将NTP时间戳转换为utc,c#-4.0,ntp,C# 4.0,Ntp,将NTP时间戳转换为utc的最简单方法是什么。我知道它是NTP格式的,我可以把它转换成任何其他格式 谢谢。 鲍勃。试试这样的吗?我不确定“1900年1月1日以来的秒数”的格式,但您可以根据需要进行修改 long ntp = 3490905600; DateTime start = new DateTime(1900, 1, 1); DateTime dt = start.AddSeconds(ntp); Console.WriteLine(dt.ToString()); Console.Wr

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

谢谢。
鲍勃。

试试这样的吗?我不确定“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()); 

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

此外,时间表示法为UTC

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

UInt64 ntpTimestamp=14236589681638796952

高32位由以下公式给出:

UInt32秒=(UInt32)((ntpTimestamp>>32)和0xffffff)

低32位由下式给出:

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

以秒为单位的数字等于最重要的字,或者在这种情况下: 秒==3314714339

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

Int32毫秒=(Int32)((双)分数/UInt32.MaxValue)*1000)

在这种情况下是12

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

DateTime BaseDate=新的日期时间(1900,1,1,0,0,0,DateTimeKind.Utc)

DateTime dt=BaseDate.AddSeconds(秒).addmillizes(毫秒)


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

这对我来说是可靠的:

#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 ;

根据该链接,自1990年1月1日起的秒数为长ntp的高阶整数。谢谢。我只是回来亲自回答。