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_Hmainwindow.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;}