获取当前时间(c++)

本文介绍了一个简单的C++函数,用于获取格式化的当前时间戳。该函数利用了C++标准库中的`std::time`和`std::localtime`来获取当前时间,并使用`std::strftime`将时间格式化为字符串。

std::string current_time_stamp()

{

std::time_t now = std::time(NULL);

std::tm* ptm = std::localtime(&now);

char buff[100];

std::strftime(buff,32,"%Y-%m-%d %H:%M%s",ptm);

return string(buff);

}

### 使用 C++ 通过网络获取当前时间的实现方法 可以通过 HTTP 请求获取网页头中的 `Date` 字段来获取当前的网络时间,也可以通过 NTP 协议与时间服务器同步时间。以下是具体的实现方法。 #### 1. 使用 libcurl 获取 HTTP 响应头中的时间信息 可以使用 `libcurl` 库发送 HTTP 请求,并从响应头中提取 `Date` 字段,从而获取当前时间。 ```cpp #include <iostream> #include <string> #include <curl/curl.h> #include <ctime> static size_t WriteCallback(void *contents, size_t size, size_t nmemb, std::string *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { std::string readBuffer; curl_easy_setopt(curl, CURLOPT_URL, "http://worldtimeapi.org/api/timezone/UTC"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); res = curl_easy_perform(curl); if (res != CURLE_OK) std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; else std::cout << "Current Time: " << readBuffer << std::endl; curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; } ``` 该方法通过 HTTP 请求获取服务器返回的当前时间信息,适用于需要通过网络获取时间的场景[^2]。 #### 2. 使用 NTP 协议与时间服务器同步时间 可以通过 NTP 协议与时间服务器进行通信,获取更精确的时间信息。以下是一个 NTP 客户端的基本实现。 ```cpp #include <winsock2.h> #include <ws2tcpip.h> #include <ctime> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #pragma comment (lib,"Ws2_32.lib") struct NTPPacket { union { struct _ControlWord { unsigned int uLI : 2; unsigned int uVersion : 3; unsigned int uMode : 3; unsigned int uStratum : 8; int nPoll : 8; int nPrecision : 8; }; int nControlWord; }; int nRootDelay; int nRootDispersion; int nReferenceIdentifier; __int64 n64ReferenceTimestamp; __int64 n64OriginateTimestamp; __int64 n64ReceiveTimestamp; int nTransmitTimestampSeconds; int nTransmitTimestampFractions; }; int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in serverAddr; NTPPacket packet = {0}; const char* ntpServer = "time.windows.com"; WSAStartup(MAKEWORD(2, 2), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(123); inet_pton(AF_INET, ntpServer, &serverAddr.sin_addr); packet.uMode = 3; // Client mode sendto(sock, (char*)&packet, sizeof(packet), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); int serverAddrLen = sizeof(serverAddr); recvfrom(sock, (char*)&packet, sizeof(packet), 0, (struct sockaddr*)&serverAddr, &serverAddrLen); __int64 ntpTime = ntohll(packet.nTransmitTimestampSeconds) - 2208988800ULL; time_t t = (time_t)ntpTime; struct tm* ptm = gmtime(&t); char buffer[32]; strftime(buffer, 32, "%Y-%m-%d %H:%M:%S", ptm); printf("NTP Time: %s\n", buffer); closesocket(sock); WSACleanup(); return 0; } ``` 此方法适用于需要高精度时间同步的场景,例如服务器时间同步或分布式系统时间管理[^4]。 #### 3. 使用 Qt 获取当前时间 如果使用 Qt 框架开发,可以通过 `QDateTime::currentDateTime()` 或 `QDateTime::currentDateTimeUtc()` 获取当前系统时间或 UTC 时间。 ```cpp #include <QDateTime> #include <QDebug> int main() { QDateTime currentTime = QDateTime::currentDateTime(); qDebug() << "Current Time: " << currentTime; QDateTime currentUtcTime = QDateTime::currentDateTimeUtc(); qDebug() << "Current UTC Time: " << currentUtcTime.toLocalTime(); return 0; } ``` 该方法适用于基于 Qt 的应用程序开发,可以方便地获取本地时间或 UTC 时间[^1]。 #### 4. 使用 C++11 标准库获取当前时间 C++11 提供了 `<chrono>` 和 `<ctime>` 库用于获取当前时间。 ```cpp #include <iostream> #include <chrono> #include <ctime> int main() { auto now = std::chrono::system_clock::now(); std::time_t now_c = std::chrono::system_clock::to_time_t(now); std::cout << "Current Time: " << std::ctime(&now_c); return 0; } ``` 该方法适用于标准 C++ 程序开发,无需依赖第三方库即可获取当前时间。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值