2

有人可以告诉我如何在 Qt 中设置时区吗?目前我正在使用 linux system() 调用来设置时区,但这并没有反映在 Qt 的 currentTime() API 中。Qt 5 及更高版本中有一个 setTimeZone() API,但我不知道如何使用它。提前致谢。

4

2 回答 2

1

而不是使用 QProcess,我可能会建议使用 QDBus。

qdbus 命令行调用:

qdbus --system org.freedesktop.timedate1 /org/freedesktop/timedate1 org.freedesktop.timedate1.SetTimezone Europe/Berlin false

Qt代码:

QDBusInterface timedated("org.freedesktop.timedate1", "/org/freedesktop/timedate1", "org.freedesktop.timedate1", QDBusConnection::systemBus());
QDBusPendingReply<> setTz = timedated.callWithArgumentList(QDBus::Block, "SetTimeZone", {"Europe/Berlin", false});
于 2019-12-10T17:00:08.340 回答
1

正如弗兰克在评论中所说,Qt 中没有直接更改系统时区的 API。使用timedatectl是一种方法。

但是,对于示例时区,可以像这样使用而不是system()调用:QProcess

auto timezone = QString("Europe/Paris");
auto command = QString("timedatectl set-timezone ") + timezone;
auto ret = QProcess::execute(command);
if (ret != 0) {
    qDebug("timedatectl failed : %d", ret);
}

如果已经有一个 QTimeZone 对象在使用,可以像这样组装命令:

auto timezoneObj = QTimeZone();

// process timezoneObj

if (!timezoneObj.isValid()) {
    qDebug("invalid timezone qobject");
    return;
}

auto timezone = timezoneObj.id();
auto command = QString("timedatectl set-timezone ") + timezone;
auto ret = QProcess::execute(command);
if (ret != 0) {
    qDebug("timedatectl failed : %d", ret);
}
于 2019-09-24T06:46:56.327 回答