You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:11:27