日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取网络时间

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取网络时间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天有一個應用需要獲取網絡時間,雖然一直知道可以從時間服務器獲取時間,卻從來也沒有操作過,借這個機會重新進行一下深入了了解。

基本的思路就是:通過SOCKET連接時間服務器,直接接收從服務器發送的過來的時間數據。

void GetNetTime() {TIME_ZONE_INFORMATION tzinfo;DWORD dwStandardDaylight;int nRet;/* Initialize Winsock */WORD wVersionRequested;WSADATA wsaData;int nErrCode;wVersionRequested = MAKEWORD(2, 2);nErrCode = WSAStartup(wVersionRequested, &wsaData);if (0 != nErrCode){return;}/* Get server IP */struct hostent *host;char *pServerIP;host = gethostbyname("time.nist.gov");if (NULL == host){return -1;}pServerIP = inet_ntoa(*(struct in_addr*)host->h_addr_list[0]);/* Connect to time server, and get time */SOCKET sockfd;char cTimeBuf[40] = { 0 };unsigned long ulTime = 0;int nTry = 0;do {if (5 == nTry++){return -1;}sockfd = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == sockfd){continue;}int TimeOut = 3000;//設置接收超時6秒setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&TimeOut, sizeof(TimeOut));sockaddr_in?? ?addr;memset(&addr, 0, sizeof(addr));addr.sin_family???????? = AF_INET;addr.sin_port?????????? = htons(37);addr.sin_addr.s_addr??? = inet_addr(pServerIP);nRet = connect(sockfd, (sockaddr *)&addr, sizeof(addr));if (SOCKET_ERROR == nRet){continue;}nRet = recv(sockfd, (char *)&ulTime, sizeof(ulTime), 0);if ((SOCKET_ERROR != nRet) && (0 != nRet)){break;}int nErr = WSAGetLastError();TRACE(_T("[%d]%s"), nErr, ConvertErrcodeToString(nErr));closesocket(sockfd);} while (1);closesocket(sockfd);unsigned long ulTimehl = ntohl(ulTime);ConvertTime(ulTimehl); }

void ConvertTime(unsigned long ulTime) {// Windows文件時間是一個64位的值,它是從1601年1月1日中午12:00到現在的時間間隔,// 單位是1/10,000,000秒,即1000萬分之1秒(100-nanosecond)FILETIME ft;SYSTEMTIME st;// 首先將基準時間(1900年1月1日0點0分0秒0毫秒)轉化為Windows文件時間st.wYear = 1900;st.wMonth = 1;st.wDay = 1;st.wHour = 0;st.wMinute = 0;st.wSecond = 0;st.wMilliseconds = 0;SystemTimeToFileTime(&st, &ft);// 然后將Time Protocol使用的基準時間加上逝去的時間(ulTime)LONGLONG *pLLong = (LONGLONG *)&ft;/* 注意:文件時間單位是1/1000 0000秒(即100ns),需要將從時間服務器上獲取的以秒為單位的ulTime做一下轉換*/*pLLong += (LONGLONG) 10000000 * ulTime;// 再將時間轉化回來,更新系統時間FileTimeToSystemTime(&ft, &st);TRACE(_T("%04d%02d%02d %02d:%02d:%02d\n"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond );return; }
各地時差都不一致,可以根據GetTimeDiff函數計算當地時差,對上面的時間加以調整:

void GetTimeDiff() {float bias;long sminute,shour;/* 獲取時區信息 */dwStandardDaylight = GetTimeZoneInformation(&tzinfo); //獲取時區與UTC的時間差 應該返回-8if (dwStandardDaylight == TIME_ZONE_ID_INVALID) //函數執行失敗{return; }/* 時差調整 */bias = tzinfo.Bias;if (dwStandardDaylight == TIME_ZONE_ID_STANDARD) //標準時間有效bias += tzinfo.StandardBias;if (dwStandardDaylight == TIME_ZONE_ID_DAYLIGHT) //夏令時間bias += tzinfo.DaylightBias;shour = bias / 60;sminute = fmod(bias, (float)60); }



總結

以上是生活随笔為你收集整理的获取网络时间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。