如何实现QTime的12/24小时制互转及动态切换显示格式
嘿,这两个问题都是Qt开发里经常碰到的场景,我来给你详细拆解下:
1. QTime在12/24小时制之间的双向转换
首先得明确:QTime本身只是存储时间的数值(时、分、秒、毫秒),并不绑定显示格式。所谓的“转换”,其实是在「QTime对象」和「对应格式的时间字符串」之间互相解析/格式化。
24小时制 → 12小时制
核心是先把24小时格式的字符串解析成QTime,再用12小时制的格式输出字符串:
// 解析24小时制字符串为QTime对象 QTime time24 = QTime::fromString("14:30:45", "HH:mm:ss"); // 格式化为12小时制字符串(带AM/PM) QString time12Str = time24.toString("hh:mm:ss AP"); // 输出结果:"02:30:45 PM"
这里的格式符要注意:
HH:24小时制的小时(00-23)hh:12小时制的小时(01-12)AP:大写的AM/PM(用ap会得到小写的am/pm)
12小时制 → 24小时制
反过来,先解析12小时格式的字符串得到QTime,再用24小时格式输出:
// 解析12小时制字符串为QTime对象 QTime time12 = QTime::fromString("02:30:45 PM", "hh:mm:ss AP"); // 格式化为24小时制字符串 QString time24Str = time12.toString("HH:mm:ss"); // 输出结果:"14:30:45"
⚠️ 注意:如果12小时制字符串没有AM/PM标识,QTime默认会当作上午(AM)处理,比如QTime::fromString("10:00", "hh:mm")得到的是10:00,转24小时制还是10:00;只有带PM的才会转换成12+小时的数值。
2. 根据用户选择切换显示当前时间的格式
这个需求需要结合定时更新时间和用户选择控件来实现,下面以Qt Widgets为例(Qt Quick逻辑类似):
步骤1:UI准备
- 加两个单选按钮:
radioBtn24(文本“24小时制”)和radioBtn12(文本“12小时制”),默认选中radioBtn24 - 加一个QLabel(
timeLabel)用来展示当前时间
步骤2:代码实现
#include <QTimer> #include <QTime> #include <QRadioButton> #include <QLabel> // 在窗口类的构造函数中初始化 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 1. 创建定时器,每秒更新一次时间 QTimer *timeTimer = new QTimer(this); connect(timeTimer, &QTimer::timeout, this, &MainWindow::updateDisplayedTime); timeTimer->start(1000); // 2. 连接单选按钮的切换信号,切换时立即更新显示 connect(ui->radioBtn24, &QRadioButton::toggled, this, &MainWindow::updateDisplayedTime); connect(ui->radioBtn12, &QRadioButton::toggled, this, &MainWindow::updateDisplayedTime); // 初始化显示一次时间 updateDisplayedTime(); } // 更新时间显示的槽函数 void MainWindow::updateDisplayedTime() { QTime currentTime = QTime::currentTime(); QString displayStr; // 根据选中的单选按钮选择格式 if (ui->radioBtn24->isChecked()) { displayStr = currentTime.toString("HH:mm:ss"); // 24小时制,带时分秒 } else { displayStr = currentTime.toString("hh:mm:ss AP"); // 12小时制,带AM/PM } ui->timeLabel->setText(displayStr); }
可选调整
- 如果不需要显示秒,把格式符里的
:ss去掉即可 - 想去掉小时的前导零,用
h代替hh/HH,比如h:mm AP会显示“2:30 PM”而不是“02:30 PM” - Qt Quick版本的话,用
Timer组件定时获取Qt.currentTime,绑定单选按钮的checked属性来切换Text的text格式即可
内容的提问来源于stack exchange,提问作者Wagmare
相关产品推荐
相关产品推荐

