QT之日期工具类——DateUtils

QT之日期工具类——DateUtils

前言

借鉴了java的相关类的思想,可以实现日期相关的计算方法。

源码

头文件

#ifndef DATEUTILS_H
#define DATEUTILS_H

#include <QString>
#include <QDateTime>

/*!
 * \brief DateUtils 是一个用来操作时间日期的工具类
 */
class DateUtils
{
public:
    DateUtils();
    /*!
     * \brief 获取当前时间字符串(hh:mm:ss.zzz)
     * \return 时间字符串
     */
    static QString getCurrTimeStr();
    /*!
     * \brief 获取当前日期字符串(yyyy-MM-dd hh:mm:ss)
     * \return 日期字符串
     */
    static QString getCurrDateTimeStr();
    /*!
     * \brief 按格式返回当前日期字符串(默认:yyyy-MM-dd hh:mm:ss)
     * \param formatStr 格式字符串
     * \return 日期字符串
     */
    static QString getCurrDateTimeStr(QString formatStr = "yyyy-MM-dd hh:mm:ss");
    /*!
     * \brief 计算开始日期到现在过去的天数
     * \param dateTime 开始日期
     * \return 过去的天数
     */
    static long pastDays(QDateTime dateTime);
    /*!
     * \brief 计算开始日期到现在过去的小时数
     * \param dateTime 开始日期
     * \return 过去的小时数
     */
    static long pastHours(QDateTime dateTime);
    /*!
     * \brief 计算开始日期到现在过去的分钟数
     * \param 开始日期
     * \return 过去的分钟数
     */
    static long pastMinutes(QDateTime dateTime);
    /*!
     * \brief 计算两个日期之间过去的天数
     * \param before 前面的日期
     * \param after 后面的日期
     * \return 过去的天数
     */
    static long twoDatePastDays(QDateTime before, QDateTime after);
    /*!
     * \brief 获取两个日期段的小时数交集(带小数)
     * \param stime1 开始日期1
     * \param etime1 结束日期1
     * \param stime2 开始日期2
     * \param etime2 结束日期2
     * \return 小时数交集(带小数)
     */
    static float getTwoDateRangeIntersection2Hours(QDateTime stime1, QDateTime etime1, QDateTime stime2, QDateTime etime2);

};

#endif // DATEUTILS_H

源文件

#include "dateutils.h"
#include <QDateTime>
#include <QList>

DateUtils::DateUtils()
{

}

QString DateUtils::getCurrTimeStr()
{
    return QTime::currentTime().toString("hh:mm:ss.zzz");
}

QString DateUtils::getCurrDateTimeStr()
{
    return QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
}

QString DateUtils::getCurrDateTimeStr(QString formatStr)
{
    return QDateTime::currentDateTime().toString(formatStr);
}

long DateUtils::pastDays(QDateTime dateTime)
{
    QDateTime now = QDateTime::currentDateTime();
    long t = now.toMSecsSinceEpoch() - dateTime.toMSecsSinceEpoch();
    return  t / (24 * 60 * 60 * 1000);
}

long DateUtils::pastHours(QDateTime dateTime)
{
    QDateTime now = QDateTime::currentDateTime();
    long t = now.toMSecsSinceEpoch() - dateTime.toMSecsSinceEpoch();
    return  t / (60 * 60 * 1000);
}

long DateUtils::pastMinutes(QDateTime dateTime)
{
    QDateTime now = QDateTime::currentDateTime();
    long t = now.toMSecsSinceEpoch() - dateTime.toMSecsSinceEpoch();
    return  t / (60 * 1000);
}


long DateUtils::twoDatePastDays(QDateTime before, QDateTime after)
{
    long t = after.toMSecsSinceEpoch() - before.toMSecsSinceEpoch();
    return t / (1000 * 60 * 60 * 24);
}

float DateUtils::getTwoDateRangeIntersection2Hours(QDateTime stime1, QDateTime etime1, QDateTime stime2, QDateTime etime2)
{
    float result = 0.0f;

    long btlong = qMin(stime1.toMSecsSinceEpoch(), etime1.toMSecsSinceEpoch());// 开始时间
    long otlong = qMax(stime1.toMSecsSinceEpoch(), etime1.toMSecsSinceEpoch());// 结束时间
    long stlong = qMin(stime2.toMSecsSinceEpoch(), etime2.toMSecsSinceEpoch());// 开始时间
    long edlong = qMax(stime2.toMSecsSinceEpoch(), etime2.toMSecsSinceEpoch());// 结束时间

    if(btlong <= edlong && otlong >= stlong)
    {
        QList<long> list;
        list << btlong << otlong << stlong << edlong;
        qSort(list.begin(), list.end()); //从小到大排序,取第二、第三计算
        float f = list.at(2) - list.at(1);
        return f / (1000.0f * 60 * 60);

    }

    return result;
}


# 题目重述 在 Qt 中如何正确设置和使用日期时间控件(如 `QDateTimeEdit`),包括:初始化为当前时间、格式化显示、获取用户选择的时间,并用于数据提交等场景。 --- # 给出答案(完整代码示例) ### ✅ 1. 设置 `QDateTimeEdit` 默认时间为当前系统时间 ```cpp // 将 QDateTimeEdit 控件的值设为当前时间 ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime()); ``` ### ✅ 2. 自定义显示格式(推荐常用格式) ```cpp // 标准格式:年-月-日 时:分:秒 ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss"); // 可读性强的格式 ui->dateTimeEdit->setDisplayFormat("yyyy年MM月dd日 HH:mm"); // 仅日期 ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd"); // 仅时间 ui->dateTimeEdit->setDisplayFormat("HH:mm:ss"); ``` ### ✅ 3. 启用日历弹出框(方便选择日期) ```cpp // 显示下拉日历,便于用户点击选择 ui->dateTimeEdit->setCalendarPopup(true); ``` ### ✅ 4. 设置可选时间范围(防止输入非法时间) ```cpp // 允许选择的时间范围:过去10年到未来1年 ui->dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime().addYears(-10)); ui->dateTimeEdit->setMaximumDateTime(QDateTime::currentDateTime().addYears(1)); ``` ### ✅ 5. 获取用户选择的时间(用于保存或发送) ```cpp // 获取 QDateTime 类型 QDateTime selectedTime = ui->dateTimeEdit->dateTime(); // 转为字符串用于 JSON 或数据库存储 QString timeStr = selectedTime.toString("yyyy-MM-dd HH:mm:ss"); qDebug() << "选择的时间:" << timeStr; ``` ### ✅ 6. 在类构造函数中完整初始化示例 ```cpp TransactionDialog::TransactionDialog(QWidget *parent) : QDialog(parent), ui(new Ui::TransactionDialog) { ui->setupUi(this); // 设置默认时间为当前时间 ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime()); // 设置显示格式 ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss"); // 启用日历弹出功能 ui->dateTimeEdit->setCalendarPopup(true); // 可选:限制时间范围 ui->dateTimeEdit->setMinimumDateTime(QDateTime::fromString("2000-01-01 00:00:00", "yyyy-MM-dd HH:mm:ss")); } ``` --- # 代码解析 1. **核心类说明**: - `QDateTime`:表示日期和时间的核心类,支持加减、比较、格式化。 - `QDateTimeEdit`:UI 控件,允许用户查看和编辑日期时间。 2. **常见格式符号含义**: | 符号 | 含义 | |------|------------| | `yyyy` | 四位年份(如 2025) | | `MM` | 两位月份(01~12) | | `dd` | 两位日期(01~31) | | `HH` | 小时(00~23) | | `mm` | 分钟(00~59) | | `ss` | 秒数(00~59) | 3. **典型应用场景**: - 添加交易记录时自动填充当前时间 - 查询条件中选择起止时间范围 - 日志系统的时间戳记录 4. **与网络通信结合使用(如发送 JSON)** ```cpp QJsonObject json; json["timestamp"] = ui->dateTimeEdit->dateTime().toString("yyyy-MM-dd HH:mm:ss"); ``` --- # 知识点(列出该代码中遇到的知识点) - **QDateTime静态方法获取当前时间**:使用`QDateTime::currentDateTime()`快速获取系统当前日期时间。 - **QDateTimeEdit控件初始化**:通过`setDateTime()`设置默认值,支持用户交互修改。 - **时间格式化显示**:调用`setDisplayFormat()`定义界面显示样式,增强用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值