1、情况简介
由于Ubuntu24.04对于安全性的考虑,以用户身份(非sudo)运行的应用程序无法直接修改内核时间,只能转而进行权限配置来修改系统时间。
2、具体操作
1、Settings-System-Date & Time 取消 Automatic Data & Time
2、GroundStation是我的应用名,pi是我的用户名,你需要自行改为自己的
bash
sudo nano /etc/polkit-1/rules.d/allow-GroundStation-time-setting.rules
在文件中写入:
bash
// Allow a specific user to set the time without a password
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.timedate1.set-time" && subject.user == "pi") {
return polkit.Result.YES;
}
});
3、Qt程序示例
cpp
bool HeartBeatReceiver::setSystemTime(u64 Timestamp_us)
{
// --- 1. 将微秒时间戳转换为 QDateTime 对象并验证 ---
QDateTime dateTime = QDateTime::fromMSecsSinceEpoch(Timestamp_us / 1000);
dateTime.setTimeSpec(Qt::UTC); // 时间戳通常是 UTC
int year = dateTime.date().year();
if (year < 2025 || year > 2030) {
qDebug() << "Validation failed: Year " << year << " is not within the required range [2025, 2030].";
return false;
}
qDebug() << "Validation passed. The year is " << year << ".";
QProcess process;
bool timeSetSuccess = false;
// --- 2. 设置系统时间 ---
QString formattedTime = dateTime.toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "Attempting to set system time..." << formattedTime;
process.start("timedatectl", QStringList() << "set-time" << formattedTime);
if (!process.waitForFinished(5000)) {
qDebug() << "Error: 'timedatectl set-time' command timed out.";
} else if (process.exitCode() == 0) {
qDebug() << "System time set successfully!";
timeSetSuccess = true;
} else {
qDebug() << "Error: Failed to set system time.";
qDebug() << "Exit Code:" << process.exitCode();
qDebug() << "Standard Error:" << process.readAllStandardError();
}
return timeSetSuccess;
}