我設法發出NTP請求,並從NTP響應中檢索服務器時間。 我想將這個數字轉換爲人類可讀的時間,用C++編寫。 有人能幫助我嗎? 作爲例子,你可以看看: http://www.4webhelp.net/us/timestamp.php?action=stamp&stamp=771554255&timezone=0 一旦你設置時間戳771554255你會得到「29/7/2010 13:14:32」。 我想在我的代碼中做同樣的事情, 有幫助嗎?將NTP時間轉換爲人類可讀的時間
3
A
回答
3
這不是C++,但是這是一個perl實現。轉換成C++,這應該是沒有什麼大不了的:
http://www.ntp.org/ntpfaq/NTP-s-related.htm#AEN6780
# usage: perl n2u.pl timestamp
# timestamp is either decimal: [0-9]+.?[0-9]*
# or hex: (0x)?[0-9]+.?(0x)?[0-9]*
# Seconds between 1900-01-01 and 1970-01-01
my $NTP2UNIX = (70 * 365 + 17) * 86400;
my $timestamp = shift;
die "Usage perl n2u.pl timestamp (with or without decimals)\n"
unless ($timestamp ne "");
my ($i, $f) = split(/\./, $timestamp, 2);
$f ||= 0;
if ($i =~ /^0x/) {
$i = oct($i);
$f = ($f =~ /^0x/) ? oct($f)/2 ** 32 : "0.$f";
} else {
$i = int($i);
$f = $timestamp - $i;
}
my $t = $i - $NTP2UNIX;
while ($t < 0) {
$t += 65536.0 * 65536.0;
}
my ($year, $mon, $day, $h, $m, $s) = (gmtime($t))[5, 4, 3, 2, 1, 0];
$s += $f;
printf("%d-%02d-%02d %02d:%02d:%06.3f\n",
$year + 1900, $mon+1, $day, $h, $m, $s);
-1
這裏是你的C++代碼..但這不是它..這裏使用的Windows API的確實需要的,但有一個偉大的數學計算背後..它是一個很大的理解痛苦,所以我沒有把它放在這裏。對於「CSNTPClient」類,你將不得不從URL複製和粘貼標題「sntp.h」內容。「http://hk.pvn.com/downloads160/sourcecode/windows/comm/720007/SntpTest/Sntp .h_.htm」這是PJ Naughters代碼示例的修改版本..有ü去...乾杯!!
#include "stdafx.h"
int main()
{
//Initialise the winsock stack
WSADATA wsaData;
BYTE wsMajorVersion = 1;
BYTE wsMinorVersion = 1;
WORD wVersionRequested = MAKEWORD(wsMinorVersion, wsMajorVersion);
if (WSAStartup(wVersionRequested, &wsaData) != 0)
{
_tprintf(_T("Failed to load winsock stack\n"));
return 1;
}
if (LOBYTE(wsaData.wVersion) != wsMajorVersion || HIBYTE(wsaData.wVersion) != wsMinorVersion)
{
_tprintf(_T("Winsock stack does not support version which this program requires\n"));
WSACleanup();
return 1;
}
//Do the actual NTP Query
CSNTPClient sntp;
NtpServerResponse response;
if (sntp.GetServerTime(specify ntp server url or ip, response))
{
_tprintf(_T("Time was successfully retreived from NTP server\n"));
SYSTEMTIME st1 = response.m_OriginateTime;
SYSTEMTIME st2 = response.m_ReceiveTime;
SYSTEMTIME st3 = response.m_TransmitTime;
SYSTEMTIME st4 = response.m_DestinationTime;
cout << response.m_DestinationTime << endl;
TIME_ZONE_INFORMATION lpTimeZoneInfo;
GetTimeZoneInformation(&lpTimeZoneInfo); //Get the local TIME ZONE
SYSTEMTIME stLocal;
//To Get Local Time from the fetched GMT/UTC Time from the server, use SystemTimeToTzSpecificLocalTime()
//To get GMT/UTC Time from Local Time, use the API TzSpecificLocalTimeToSystemTime()
SystemTimeToTzSpecificLocalTime(&lpTimeZoneInfo, &st3, &stLocal);
_tprintf(_T("\n"));
_tprintf(_T(" DD/MM/YYYY HH:MM:SS.MS\n"));
_tprintf(_T("\n\n\nObtaining Time thru API SystemTimeToTzSpecificLocalTime :\n\n"));
_tprintf(_T("Server Transmit Date was %02d/%02d/%04d, %02d:%02d:%02d.%03d\n"), st3.wDay, st3.wMonth, st3.wYear, st3.wHour, st3.wMinute, st3.wSecond, st3.wMilliseconds);
_tprintf(_T("Client Destination Date was %02d/%02d/%04d, %02d:%02d:%02d.%03d\n"), stLocal.wDay, stLocal.wMonth, stLocal.wYear, stLocal.wHour, stLocal.wMinute, stLocal.wSecond, stLocal.wMilliseconds);
}
}
+0
嘿,一個獨立的解決方案和它的描述會更好,我認爲。 – Aldream 2013-06-01 13:24:01
相關問題
- 1. 將NTP時間戳轉換爲utc
- 2. 將時間從毫秒轉換爲人類可讀的日期
- 3. Matlab將UNIX時間轉換爲人類可讀格式
- 4. 將zip文件時間戳轉換爲人類可讀格式
- 5. 將時間戳轉換爲可讀的日期/時間PHP
- 6. Python的 - 從劃時代的時間轉換成秒人類可讀的時間
- 7. 將時間戳轉換爲MS Access中的人可讀
- 8. 將時代轉換爲人類可閱讀的特定時區
- 9. 轉換Unix的時間,人類可讀的格式
- 10. 自動人類可讀時間間隔
- 11. 如何在SQL中將秒數轉換爲人類可讀的持續時間?
- 12. 將unix時間戳轉換爲laravel中的人類可讀日期
- 13. 在Clojure中將紀元時間轉換爲人類可讀的日期
- 14. 在PHP中將unix時間戳轉換爲人類可讀的日期?
- 15. 轉換毫秒到人類可讀的時間流逝
- 16. 在查詢期間將時間戳轉換爲可讀日期
- 17. 如何將訪問開始時間轉換爲大查詢中可讀的人類日期或時間戳?
- 18. 將時間轉換爲MySQL時間
- 19. 將日期時間轉換爲時間
- 20. 將時間戳轉換爲時間
- 21. Python的人類可讀的時間差
- 22. 人類可讀時間的格式? JavaScript
- 23. 顯示人類可讀的時間 - PHP
- 24. 如何將Unix時間戳轉換爲AIX 5.3中的可讀時間戳
- 25. 將ntp小時轉換爲毫秒
- 26. Python:將Varbinary類型的時間戳轉換爲unix時間戳
- 27. 轉換日爲特定的天量人類可讀的持續時間文本
- 28. java中的Webkit/chrome時間戳到人類可讀時間
- 29. 轉換時代時間戳到SQL Server(人類可讀的格式)
- 30. 人類可讀UTC日期時間
作爲第一個答案mentionned,你指向的頁面不處理NTP時間戳(從1900年1月1日開始,64位,秒+秒),但是使用Unix時間(從1970年1月1日開始,32位,秒) – pascal 2010-07-29 13:45:44
作爲一個短命的用一個Perl樣本),你只需要拿到前32位,從1900年1月1日到1970年1月1日(大約70 * 365.25 * 24 * 3600),刪除秒數,並且你有一個Unix時間()兼容價值... – pascal 2010-07-29 13:50:27
Jus t用於檢查,32位提供了NTP時間戳的秒數,自1968年以來設置了高位位...所以,作爲有符號整數,它看起來是負的。 – pascal 2010-07-29 13:54:08