对于任何程序,快速定位程序当前的时间是一个很重要的事情,其中目前主流的方法是通过互联网sntp协议实现,sntp协议就是向服务器请求,获取当前时间戳的协议,可以实现精确获取时间戳的目的。首先给大家讲解下sntp协议的类型,sntp协议是udp协议,端口号是123,只需要按照特定格式发送请求到123端口,服务器就会返回您要的当前时间,而时间是从1900年1月1日开始的时间戳,与我们常用的格林时间(1970年1月1日)相比,差了70年,这个时间请记住要剪掉,而1900年到1970年经过了0x83aa7e80秒,下面我们以阿里云的ntp服务器为例写一段请求互联网时间的代码。
ntp协议格式的详细资料请参考:传送门
话不多说,上代码:
package main import ( "fmt" "net" ) func main () { conn, err := net.Dial("udp", "ntp.aliyun.com:123"); if err != nil { fmt.Println("net.Dial err:", err) return } defer conn.Close() conn.Write([]byte{ 0xdb, 0x00, 0x11, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) var b [512]byte fmt.Println("wait read") n, err := conn.Read(b[:]) if err != nil { fmt.Println(err) return } fmt.Println("时间戳为: ", uint32(b[n-8])<<24+uint32(b[n-7])<<16+uint32(b[n-6])<<8+uint32(b[n-5])-0x83aa7e80) // 返回为1970年1月1日到现在的秒数 }
文章作者:沃航科技