W32TM /NTPTE 命令如何工作?如何用它显示当前时间?

npo*_*aka 3 windows cmd batch-file command-prompt ntp

到目前为止我得到的是w32tm /ntpte使用从 1900/1/1 开始到 2036/7/2 结束的 2^32 个切片。根据我的计算,每个周期大约为 1 秒。不好的事情是周期不是连续枚举的,所有内容都是基于 2 以上的幂的周期。 它使用 NTP 协议(​​该文档读起来不太愉快)并且我想获取一个时代和当前时间戳并使用 2^32 来计算所需的日期 - 但我不知道如何获取当前时间戳以及使用哪个时代。 这里的这个人有一些启发 ,但我无法得到与他的例子相同的结果。

这也是一个简单的例子:

c:\> w32tm /ntpte 256
0x014F37D494604000 - 109207 18:12:16.0000000 - 1.1.1900  20:12 
Run Code Online (Sandbox Code Playgroud)

我也不知道这些十六进制和第二个数字是什么,但知道会很有趣。可能无法用简单的批处理来计算我需要的东西,所以如果(在整个宇宙中)有人知道如何如何实现这一点可以使用脚本/编程语言作为说明性示例/解释。

MBu*_*MBu 5

我没能弄清楚十六进制数字的含义,但第二个数字是 ANSI 日期,即自 1601 年 1 月 1 日以来经过的天数。参数是自 1900-01-01 00:00 以来经过的秒数:00,但它具有相反的字节顺序,第一个字节是最低有效的(1900-01-01 00:00:01 被编码为 0x01000000)。要让 w32tm 打印出 2013 年 1 月 15 日 22:00 UTC,请使用以下命令:

w32tm /ntpte 0xe04fa0d4
Run Code Online (Sandbox Code Playgroud)

或者

w32tm /ntpte 3763314900
Run Code Online (Sandbox Code Playgroud)

(从十六进制转换为十进制就像字节顺序是正常的一样)。

编辑:w32tm 打印的十六进制值似乎是一个 64 位整数,表示自 1601 年 1 月 1 日以来 100 纳秒间隔的数量。从这篇文章中我知道这就是 Windows 存储 FILETIME 的方式。

EDIT2:再玩一些之后我发现了另外两件事:

  1. 传递给的参数w32tm /ntpte实际上是一个 64 位整数。正如我之前所写,最高有效 32 位表示自 1900-01-01 00:00:00 以来的秒数,而最低有效 32 位表示秒的分数。整个 64 位数字表示自 1900 年 1 月 1 日以来 1/(2 的 32 次方) 秒间隔的数量。因此0x0000008000000000等于 1900-01-01 00:00:00 之后的 1/2 秒。

  2. 打印的十六进制值w32tm /ntpte可以直接作为参数传递给w32tm /ntte