592 字
3 分钟
Qt 获取网络时间

苏宁易购时间API#

url:http://quan.suning.com/getSysTime.do

返回格式:json

{
"sysTime2": "2025-04-24 16:08:00",
"sysTime1": "20250424160800"
}

Qt工程#

mainwindow.h#

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QLabel>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void fetchTime();
void handleNetworkReply(QNetworkReply *reply);
void updateLocalTime();
private:
QNetworkAccessManager *manager;
QTimer *timer;
QTimer *updateTimeTimer;
QLabel *label;
int retryCount;
int maxRetryCount = 5;
};
#endif // MAINWINDOW_H

mainwindow.cpp#

#include "mainwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QDateTime>
#include <QTimeZone>
#include <QTimer>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, manager(new QNetworkAccessManager(this))
, timer(new QTimer(this))
, updateTimeTimer(new QTimer(this))
, retryCount(0)
{
this->setGeometry(0, 0, 800, 480);
label = new QLabel(this);
label->setGeometry(400, 200, 200, 50);
//绑定网络请求结束信号:网络请求管理器->主GUI
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleNetworkReply(QNetworkReply*)));
// 本地时间更新定时器,每秒更新时间
connect(updateTimeTimer, &QTimer::timeout, this, &MainWindow::updateLocalTime);
updateTimeTimer->start(1000);
// 网络时间同步定时器,每30秒请求一次网络时间
timer->start(30000);
connect(timer, &QTimer::timeout, this, &MainWindow::fetchTime); //绑定定时器超时信号,定时器->主GUI,槽函数:重新获取网络时间
fetchTime(); // 启动时请求一次网络时间
}
MainWindow::~MainWindow() {}
//本地时间更新定时器回调
void MainWindow::updateLocalTime()
{
QDateTime currentTime = QDateTime::currentDateTime(); //获取本地时间
label->setText("本地时间:" + currentTime.toString("yyyy-MM-dd hh:mm:ss"));
}
//获取网络时间
void MainWindow::fetchTime()
{
QUrl url("http://quan.suning.com/getSysTime.do"); //苏宁易购时间API
QNetworkRequest request(url); //向url发送请求
qDebug() << "发送请求:" << url;
manager->get(request);
}
void MainWindow::handleNetworkReply(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
qDebug() << "网络错误:" << reply->errorString();
// 如果请求失败,且重试次数小于最大重试次数,进行重试
if (retryCount < maxRetryCount) {
retryCount++;
qDebug() << "重试次数:" << retryCount;
fetchTime(); // 重新请求
} else {
label->setText("获取时间失败,已达到最大重试次数");
qDebug() << "获取时间失败,已达到最大重试次数";
}
reply->deleteLater();
return;
}
//请求成功,读取全部响应数据
QByteArray responseData = reply->readAll();
qDebug() << "收到响应:" << responseData;
//将响应解析为json
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData, &parseError);
if (parseError.error != QJsonParseError::NoError) {
label->setText("JSON解析失败:" + parseError.errorString());
qDebug() << "JSON解析错误:" << parseError.errorString();
reply->deleteLater();
return;
}
//提取"sysTime2"时间字段并转换为QDateTime
QJsonObject obj = jsonDoc.object();
QString timeStr = obj.value("sysTime2").toString(); // "2025-04-24 09:10:44"
QDateTime networkTime = QDateTime::fromString(timeStr, "yyyy-MM-dd HH:mm:ss");
// 获取当前本地时间
QDateTime localTime = QDateTime::currentDateTime();
// 计算误差
qint64 timeDiff = networkTime.toMSecsSinceEpoch() - localTime.toMSecsSinceEpoch();
qDebug() << "时间误差:" << timeDiff << "毫秒";
// 如果误差大于2秒,则进行时间修正
if (qAbs(timeDiff) > 2000) {
qDebug() << "误差大于2秒,进行修正";
// 修正本地时间
label->setText("本地时间已修正:" + networkTime.toString("yyyy-MM-dd hh:mm:ss"));
}
reply->deleteLater();
// 重置重试计数器
retryCount = 0;
}
Qt 获取网络时间
https://arkmostima.pages.dev/posts/qt获取网络时间/
作者
Aki
发布于
2025-04-24
许可协议
CC BY-NC-SA 4.0