Qt 获取网络时间

苏宁易购时间API

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

返回格式:json

1
2
3
4
{
"sysTime2": "2025-04-24 16:08:00",
"sysTime1": "20250424160800"
}

Qt工程

mainwindow.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#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 获取网络时间
http://akichen891.github.io/2025/04/24/Qt获取网络时间/
作者
Aki
发布于
2025年4月24日
更新于
2025年4月24日
许可协议