Qt时间日期处理与定时器使用总结

发布于:2024-07-03 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、日期时间数据

1.QTime

        用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下:

//注:秒(s)和毫秒(ms)有默认值0
QTime::QTime(int h, int m, int s = 0, int ms = 0)

        若无须初始化时间数据,可以使用静态函数 QTime::currentTime() 来创建一个QTime对象,并获取当前时间:

QTime time = QTime::currentTime();

        在通常情况下,我们直接获取当前时间即可,如需修改当前时间可直接使用setHMS方法。因此后文将不再介绍使用函数定义的方法操作时间数据。

        在默认情况下,QTime总是使用24小时制,不区分AM/PM。那么我们想要用到12小时制时该怎么处理时间数据呢?这里需要用到一个函数 toString() 来格式化时间(后文有介绍)。

QTime常用函数接口
int hour() 返回当前小时数据
int minute() 返回当前分钟数据
int second() 返回当前秒数据
int msec() 返回当前毫秒数据
bool setHMS(int h, int m, int s, int ms = 0) 设置时间
int msecsSinceStartOfDay() 返回从00:00:00开始的毫秒数
QTime addSecs(int s)

返回当前±s秒后的时间

int secsTo(QTime t) 返回当前时间与t相差的秒数

2.QDate

        用于存储和操作日期数据的类,其中包含年、月、日数据。同样也可使用 QDate::currentDate() 来获取当前日期。

        当然说到日期,其中一个避不开的话题就是判断闰年。这里Qt直接给了一个静态函数方便判断哪一年是否为闰年:

bool QDate::isLeapYear(int year)
QDate常用函数接口

int year()   

返回当前日期的年数据
int month() 返回当前日期的月数据
int day() 返回当前日期的日数据
int dayOfWeek() 返回星期几
bool setDate(int year, int month, int day) 设置日期
bool getDate(int *year, int *month, int *day) 获取日期
QDate addDays(int ndays) 返回当前日期再加几天的日期
qint64 daysTo(QDate d) 返回与日期d的间隔天数

3.QDateTime

        表示日期数据和时间数据的类。可通过如下方式获取日期和时间:

QDateTime dateTime = QDateTime::currentDateTime();
QDate dateTime = DT1.date();   //获取日期
QTime dateTime = DT1.time();   //获取时间
QDateTime常用函数接口
qint64 toSecsSinceEpoch() 返回与1970年1月1日相差的秒数
void setSecsSinceEpoch(qint64 secs) 设置与1970年1月1日相差的秒数为当前的日期数据
QdateTime toUTC() 将当前时间转换为UTC数据

注:UTC(协调世界时,Coordinated Universal Time)是世界上时间的标准,它不受时区影响,并且基于原子钟的精确计时。UTC时间是一种时间标准,用于全球的时钟和时间信号。

4.格式化日期时间数据

        QTime、QDate、QDateTime都有格式化数据方法 toString() 和 fromString()。

a.toString()

        将当前的日期时间数据转换为字符串。函数原型定义如下:

QString QDateTime::toString(const QString &format)

        format为转化后的格式,Qt提供了一些预定义的格式可以直接使用。常用的为:Qt::TextDate、Qt::ISODate、Qt::SystemLocaleShortDate(Qt6已被移除)等。当然也可以使用一些自定义格式,例如:

  • yyyy:四位数的年份
  • MM:两位数的月份(01-12)
  • dd:两位数的日期(01-31)
  • hh:两位数的小时(00-23)
  • mm:两位数的分钟(00-59)
  • ss:两位数的秒(00-59)
  • zzz:三位数的毫秒(000-999)
  • AP或A:使用AM/PM表示,即从24小时制转化为12小时制

        注:在上面的格式中,如果只写一位,如‘d’,则表示不补零显示(1-31)而非(01-31)。 举例:

QDateTime dateTime = QDateTime::currentDateTime();
qDebug() << "TextDate format:" << dateTime.toString(Qt::TextDate);
qDebug() << "ISODate format:" << dateTime.toString(Qt::ISODate);
qDebug() << "Custom format:" << dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz AP");

        其输出结果为:

b.fromString()

        将字符串转化为相应类的对象。其函数原型如下:

QDateTime QDateTime::fromString(const QString &string, const QString &format)

        举个例子:

QString dateTimeString = "2024-07-02 14:30:45.123";
QDateTime dateTime1 = QDateTime::fromString(dateTimeString, Qt::ISODate);
QDateTime dateTime2 = QDateTime::fromString(dateTimeString, "yyyy-MM-dd hh:mm:ss.zzz");
qDebug() << "DateTime1:" << dateTime1.toString();
qDebug() << "DateTime2:" << dateTime2.toString();

        输出结果为:

5.界面组件

        具体在创建界面时,可拖动如图所示组件实现:

 二、定时器

1.QTimer

        QTimer的父类为QObject,支持Qt的元对象系统。因此虽然它不是一个界面组件类,但是它也有属性、信号(timeout())和槽(start()、stop()、自定义等)。其主要属性如下:

属性 类型 功能
interval int 定时周期,单位ms
singleShot bool true表示单次定时
timerType Qt::TimerType 精度类型。分为精确、粗糙、非常粗糙
active bool ture表示定时器正在运行
a.timeout()信号

        当定时器通过 start() 启动后,每当定时溢出一次(定时周期到了),QTimer就会发射一个 timeout() 信号。如果是连续定时,QTimer就会发射多次 timeout() 信号。举个例子:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QTimer *m_timer = new QTimer(this);      //创建定时器,需要动态分配内存
    m_timer->stop();            //先停止定时器
    m_timer->setTimerType(Qt::CoarseTimer);     //设置定时器精度等级:粗糙,误差不超过整个周期的5%
    m_timer->setInterval(3000); //设置定时器的周期为3s
    m_timer->setSingleShot(true);   //设置单次定时

    connect(m_timer,SIGNAL(timeout()),this,SLOT(do_timer_timeout()));   //关联定时器的信号与槽
}

//与定时器的timeout()信号关联的槽函数
void Widget::do_timer_timeout()
{
    QApplication::beep();   //定时溢出时,系统的蜂鸣器发声
}

//“开始”按钮来启动定时器
void Widget::on_btnStart_clicked()
{
    m_timer->start();     //启动定时器,m_timer为QTimer类
}

        那么当点击开始按钮后,在3s后就会听到系统的蜂鸣声。

b.静态函数singleShot()

        这个函数用来创建和启动单次定时器,并且将定时器的timeout()信号与指定槽函数关联。也就是说,如果只是定时一次,那么就无须繁琐的设置,也无须启动,随调随用。函数定义如下:

void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *reveiver, const char *member)

那么上面的例子就可以这样改写:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

//与定时器的timeout()信号关联的槽函数
void Widget::do_timer_timeout()
{
    QApplication::beep();   //定时溢出时,系统的蜂鸣器发声
}

//动态创建单次定时器
void Widget::on_btnOneShot_clicked()
{
    QTimer::singleShot(3000,Qt::CoarseTimer,this,&Widget::do_timer_timeout);
}

2.QElapsedTimer

        这个类用于快速计算两个事件的间隔时间。与QTimer不同的是,它没有父类,不支持Qt的元对象系统,所以只有一些简单的接口函数。使用起来也比较简单,举个例子即可快速了解:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    QElapsedTimer m_counter;   // 创建计时器
    m_counter.start();    //启动计时器,注意这里没有stop()方法
}

//停止计时
void Widget::on_btnStop_clicked()
{
    int tmMsec=m_counter.elapsed();  //毫秒数
    int ms= tmMsec % 1000;  //余数毫秒
    int sec=tmMsec/1000;    //整秒

    QString str=QString("流逝的时间:%1秒,%2毫秒").arg(sec).arg(ms,3,10,QChar('0'));
    qDebug() << "Elapsed time:" << str;
}

        点击停止按钮后可看到输出框的结果为:


        以上就是关于Qt中关于时间日期数据的一些总结。虽查阅大量资料,可能仍有部分错误,望读者不吝赐教。