2.6 时间日期处理
2.6.1 QDateTime类于QDateTimeEdit控件介绍
QDateTime类提供了日期和时间相关处理函数,相当于组合的QDate和QTime类。
以下将分别介绍QDateTimeEdit控件和QDateTime类常用的一些成员函数。
QDateTimeEdit控件介绍
头文件
#include <QDateTimeEdit>
1.QDateTimeEdit构造函数
QDateTimeEdit(QWidget *parent = Q_NULLPTR)
QDateTimeEdit(const QDateTime &datetime, QWidget *parent = Q_NULLPTR)
QDateTimeEdit(const QDate &date, QWidget *parent = Q_NULLPTR)
QDateTimeEdit(const QTime &time, QWidget *parent = Q_NULLPTR)
QDateTimeEdit支持传入QDateTime、QDate、QTime类作为形参。其中QDateTime类用于获取本地系统的时间和日期相关信息,QDate用于获取本地系统的日期相关信息,QTime用于获取系统时间,一般用与测量时间的跨度。
三种形参传入方式使用示例:
#include <QApplication>
#include <QDate>
#include <QDateTimeEdit>
#include <QTime>
#include <QHBoxLayout>
#include <QVBoxLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *window = new QWidget;
QDateTimeEdit *dat1 = new QDateTimeEdit(QDate::currentDate()); //获取当前系统日期
QDateTimeEdit *dat2 = new QDateTimeEdit(QTime::currentTime());//获取当前系统时间
QDateTimeEdit *dat3 = new QDateTimeEdit(QDateTime::currentDateTime());//获取当前系统时间日期
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(dat1);
layout->addWidget(dat2);
layout->addWidget(dat3);
window->setLayout(layout);
window->show();
return a.exec();
}
图2-6-2 时间日期显示
boocalendarPopup() const //获取enable属性
void setCalendarPopup(booenable) //设置enable属性
示例:
QDateTimeEdit *dat = new QDateTimeEdit(QDateTime::currentDateTime());
dat->setCalendarPopup(true);
3.设置QDateTimeEdit弹出的日历小部件
QCalendarWidget *QDateTimeEdit::calendarWidget() const //获取QDateTimeEdit弹出的日历小部件
void QDateTimeEdit::setCalendarWidget(QCalendarWidget *calendarWidget) //设置日历小部件
4.设置输入日期的最大最小范围
QDate maximumDate()const //获取可输入的最大日期
void setMaximumDate(const QDate &max) //设置可输入的最大日期
void clearMaximumDate() //清除设置,还原默认值
QDate minimumDate() const //获取可输入的最小日期
void setMinimumDate(const QDate &min) //设置可输入的最小日期
void clearMinimumDate()//清除设置,还原默认值
以上函数主要是针对输入的日期进行限制。默认情况下输入的最大日期为7999年12月31日。
示例:
QDateTimeEdit *dat = new QDateTimeEdit(QDateTime::currentDateTime());
dat->setMaximumDate(QDate(2016,12,10)); //设置日期的最大范围为2016.12.10
dat->setMinimumDate(QDate(2015,12,10)); //设置日期的最小范围为2015.12.10
5.设置输入时间的最大最小范围
QTime maximumTime() const
void setMaximumTime(const QTime &max)
void clearMaximumTime()
QTime minimumTime() const
void setMinimumTime(const QTime &min)
void clearMinimumTime()
以上函数主要针对输入的时间进行限制。
示例:
QDateTimeEdit *dat = new QDateTimeEdit(QTime::currentTime());
dat->setMaximumTime(QTime(10,30,30,30)); //最大时间范围。参数分别为:时、分、秒、毫秒
dat->setMinimumTime(QTime(8,30,30,30)); //最小时间范围。
6.设置输入日期时间的最大最小范围
QDateTime maximumDateTime() const
void setMaximumDateTime(const QDateTime &dt)
void clearMaximumDateTime()
QDateTime minimumDateTime() const
void setMinimumDateTime(const QDateTime &dt)
void clearMinimumDateTime()
以上函数可以对输入的日期和时间进行限制。
7.设置输入范围的便捷函数
setDateRange(const QDate &min, const QDate &max)
setDateTimeRange(const QDateTime &min, const QDateTime &max)
void setTimeRange(const QTime &min, const QTime &max)
以上三个函数类似于4、5、6小节介绍设置范围的函数。
QDate date() const //获取当前显示的日期
void setDate(const QDate &date) //设置当前显示的日期
[signal] void QDateTimeEdit::dateChanged(const QDate &date)
QDateTime dateTime() const
void setDateTime(const QDateTime &dateTime)
[signal] void QDateTimeEdit::dateTimeChanged(const QDateTime &datetime)
QTime time() const
void setTime(const QTime &time)
void timeChanged(const QTime &time)
11.设置日期和时间显示的格式
QString displayFormat() const
void setDisplayFormat(const QString &format)
常用的格式如下:
yyyy-MM-dd h:m:s ap
yyyy-MM-ddhh:mm:ss
d表示日,M表示月,y表示年,h表示小时,m表示分钟,s表示秒。
示例:
QDateTimeEdit *dat = new QDateTimeEdit(QDateTime::currentDateTime());
//dat->setDisplayFormat(“yyyy-MM-dd hh:mm:ss”);
dat->setDisplayFormat(“yyyy-MM-dd h:m:s ap”);
图2-6-4 两种不同的显示格式
QDateTime类介绍
1.构造QDateTime对象
QDateTime(const QDate &date)
QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec = Qt::LocalTime)
QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds)
QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone)
QDateTime(const QDateTime &other) //复制构造函数
QDateTime构造函数支持传入的类型较多。主要涉及到QDate和QTime。后面将会详细介绍QDate和QTime。
2.获取系统时间和日期
[static] QDateTime QDateTime::currentDateTime() //本地时间
[static] QDateTime QDateTime::currentDateTimeUtc() //世界协调时间UTC
示例:
QDateTime time1(QDateTime::currentDateTime()); //获取当前系统时间
QDateTime time2(QDateTime::currentDateTimeUtc()); //获取当前UTC世界统一时间
qDebug()<<time1.toString(“yyyy-M-d h:m:s:z”); //打印结果:”2016-10-24 12:9:57:690″
qDebug()<<time2.toString(“yyyy-M-d h:m:s:z”); //打印结果:”2016-10-24 4:9:57:691″
3.调整时间和日期
QDateTime addYears(int nyears) const //调整年
QDateTime addMonths(int nmonths) const //调整月份
QDateTime addDays(qint64 ndays) const //调整日
QDateTime addSecs(qint64 s) const //调整秒
QDateTime addMSecs(qint64 msecs) const //调整毫秒
示例:
QDate date(2016,10,18); //构造日期
QTime time(10,12,13,14); //构造时间
QDateTime datetime(date,time);
qDebug()<<datetime.toString(“yyyy-M-d h:m:s:z”); //输出结果:”2016-10-18 10:12:13:14″
datetime=datetime.addDays(2); //在当前时间基础上增加2天
datetime=datetime.addYears(-1); //在当前时间基础上减去1年
qDebug()<<datetime.toString(“yyyy-M-d h:m:s:z”); //输出结果:”2015-10-20 10:12:13:14″
4.单独设置时间和日期
void QDateTime::setDate(const QDate &date) //设置日期
QDate QDateTime::date() const //获取日期
void QDateTime::setTime(const QTime &time) //设置时间
QTime QDateTime::time() const //获取时间
设置之后可以使用以下函数判断包含的时间是否合法:
booisNull() const //判断时间日期是否为空
booisValid() const //判断时间日期是否合法
5.将时间日期转为字符串格式返回
String toString(const QString &format) const
QString toString(Qt::DateFormat format = Qt::TextDate) const
详细格式说明分别参考2.6.2节和2.6.3节对应的toString函数。
6.获取当前时间对应的世界标准时间
QDateTime QDateTime::toUTC() const
示例:
QDate date(2016,10,18);
QTime time(10,12,13,14);
QDateTime datetime(date,time);
qDebug()<<datetime.toString(“yyyy-M-d h:m:s:z”); //输出结果:”2016-10-18 10:12:13:14″
datetime=datetime.toUTC();
qDebug()<<datetime.toString(“yyyy-M-d h:m:s:z”); //输出结果:”2016-10-18 2:12:13:14″
2.6.2 QDate类与QDateEdit控件介绍(日期处理)
//头文件
#include <QDateEdit>
#include <QDate>
以下将介绍QDate常用的相关成员函数。
1.构造函数
QDate()
QDate(int y, int m, int d)
构造函数中可以直接填入年月日参数。后面也可以使用setDate函数进行修改。
示例:
QDate date(2016,5,12);
qDebug()<<date.toString(); //输出结果:”周四 5月 12 2016″
2.获取当前系统日期
[static] QDate QDate::currentDate()
示例:
QDate date(QDate::currentDate());
QDateEdit dateEdit(date);
dateEdit.show();
图2-6-5 显示本地系统日期
3.调整日期
QDate addDays(qint64 ndays) const //调整日
QDate addMonths(int nmonths) const //调整月
QDate addYears(int nyears) const //调整年
以上函数用于在本身存在的日期上增加或者减少时间。比如:QDate本身包含的年份为2016年,调用addYears(1)函数后,QDate包含的年份就变为2017年。添加成功后返回QDate对象。
示例:
QDate date(2016,2,10);
date=date.addYears(1); //增加1年
date=date.addMonths(4); //增加4个月
date=date.addDays(-5); //减去5天
qDebug()<<date.toString(“yyyy-MM-dd”); //输出结果:”2017-06-05″
4.获取经过日期与剩下日期相关信息
int day() const //返回本月的日期,范围:1日-31日。返回0表示无效
int year() const //返回当前年份
int month() const //返回当前月份
int dayOfWeek() const //返回星期,范围:星期1至7。
int dayOfYear() const //返回本年经过的总天数。范围:1到365(平年)或366(闰年)。
int daysInMonth() const //返回本月总天数。范围:28日至31日。
int daysInYear() const //返回本年总天数。范围:365 或者 366。
示例:
QDate date(2016,2,10);
qDebug()<<“当前日期:”<<date.toString(“yyyy-MM-dd”);
qDebug()<<“当前年:”<<date.year();
qDebug()<<“当前月:”<<date.month();
qDebug()<<“本月号数:”<<date.day();
qDebug()<<“星期:”<<date.dayOfWeek();
qDebug()<<“本年已经过去:”<<date.dayOfYear()<<“天”;
qDebug()<<“本月总天数:”<<date.daysInMonth();
qDebug()<<“本年总天数:”<<date.daysInYear();
输出结果:
当前日期: “2016-02-10”
当前年: 2016
当前月: 2
本月号数: 10
星期: 3
本年已经过去: 41 天
本月总天数: 29
本年总天数: 366
5.判断两个日期之间相差的天数
qint64 QDate::daysTo(const QDate &d) const
示例:
QDate d1(2016, 5, 17); // May 17, 2016
QDate d2(2016, 5, 20); // May 20, 2016
qDebug()<<d1.daysTo(d2); // returns 3
qDebug()<<d2.daysTo(d1); // returns -3
6.获取当前的日期
void QDate::getDate(int *year, int *month, int *day) const
示例:
int year,month,day;
QDate date(2016,2,10);
date.getDate(&year,&month,&day);
qDebug()<<year<<“-“<<month<<“-“<<day; //输出结果:2016 – 2 – 10
7.判断日期的合法性
booQDate::isNull() const //判断日期是否为空。日期为空将返回true
booQDate::isValid() const //判断日期是否有效。日期有效将返回true
示例:
QDate dat1(2016,2,10);
qDebug()<<dat1.isValid();//true
QDate dat2(2016,55,10);
qDebug()<<dat2.isValid();//false
Qdate还提供了一个isValid静态函数用于判断指定日期是否合法:
[static] booQDate::isValid(int year, int month, int day)
示例:
qDebug()<<QDate::isValid(2017, 10, 17);//true
qDebug()<<QDate::isValid(2016, 13, 17);//false。月份错误
qDebug()<<QDate::isValid(2002, 10, 33);//false。日期错误
8.将日期转为字符串返回
QString toString(const QString &format) const
QString toString(Qt::DateFormat format = Qt::TextDate) const
toString是一个重载函数,支持两种输入格式。转换之后将返回QString。
format格式说明:
d
数字前不补0 。范围(1号至31号)
dd
数字前自动补0 。范围(01号至31号)
ddd
缩写为本地化名称。比如:”周二”
dddd
本地化名称全称。比如:”星期二”
M
数字前不补0 。比如:(1月至12月)
MM
数字前自动补0。比如:(01月至12月)
MMM
缩写本地化月名字。比如:”2月”
MMMM
本地化名称全称。 比如:”二月”
yy
表示本年的两位数 范围(00 至 99)。比如:2016 返回16。
yyyy
表示本年的四位数。比如:2016就返回2016
Qt::DateFormat枚举值:
Qt::TextDate
输出格式示例:”周二 2月 9 2016″
Qt::ISODate
输出格式示例:”2016-02-09″
Qt::SystemLocaleShortDate
输出格式示例:”2016/2/9″
Qt::SystemLocaleLongDate
输出格式示例:”2016年2月9日”
示例:
QDate date(2016,10,24);
qDebug()<<date.toString(“yyyy MMMM dddd”); //结果:”2016 十月 星期一”
qDebug()<<date.toString(“yyyy-M-d”); //结果:”2016-10-24″
qDebug()<<date.toString(Qt::TextDate); //结果:”周一 10月 24 2016″
qDebug()<<date.toString(Qt::ISODate); //结果:”2016-10-24″
qDebug()<<date.toString(Qt::SystemLocaleShortDate);//结果:”2016/10/24″
qDebug()<<date.toString(Qt::SystemLocaleLongDate);//结果:”2016年10月24日”
9.标准日期与天数之间的转换
qint64 toJulianDay() const //返回日期对应的天数。
[static] QDate QDate::fromJulianDay(qint64 jd) //将天数转为QDate对象返回。
示例:
QDate date(2016,10,24);
qDebug()<<date.toJulianDay(); //结果:2457686
date=QDate::fromJulianDay(2457687);
qDebug()<<date.toString(“yyyy-M-d”); //结果:”2016-10-25″
10.Qdate支持的重载运算符
boooperator!=(const QTime &t) const
boooperator<(const QTime &t) const
boooperator<=(const QTime &t) const
boooperator==(const QTime &t) const
boooperator>(const QTime &t) const
boooperator>=(const QTime &t) const
示例:
QDate dat1(QDate::currentDate());
QDate dat2(2016,11,1);
if(dat1>=dat2) //比较日期
{
}
2.6.3 QTime类与QTimeEdit控件介绍(时间处理)
QTime类提供了时钟时间功能,操作的是本地时间,不区分时区,它可以从系统时钟中读取当前的时间,并提供比较时间和操作时间的函数。QTime操作的是24小时时钟格式,没有AM/PM概念。QTime精确性取决于操作系统的精确性,不是所有的操作系统都有毫秒级的精确度。hour()、minute()、second()和msec()函数提供了对时、分、秒和毫秒单位时间的访问方法。QTime可以使用start()、restart()和elapsed()函数配合测量经过的某一段时间。QTime类也提供了一整套的操作符来比较两个QTime对象。
QTimeEdit控件用于显示从QTime对象中读取的时间。QTimeEdit的构造函数中可以直接传入QTime对象。
QTime time(QTime::currentTime());
QTimeEdit timeEdit(time);
timeEdit.show();
图2-6-6 使用QTimeEdit显示系统时间
1.构造QTime对象
QTime()
QTime(int h, int m, int s = 0, int ms = 0)
示例:
QTime time(13,10,10,10); //传入的参数:时、分、秒、毫秒
qDebug()<<time.toString(); //输出结果:”13:10:10″
2.获取系统时间
[static] QTime QTime::currentTime()
示例:
QTime time(QTime::currentTime()); //传入的参数:时、分、秒、毫秒
qDebug()<<time.toString(); //输出时间:”20:11:55″
3.调整时间
QTime addMSecs(int ms) const
QTime addSecs(int s) const
addMSecs和addSecs函数用于在当前时间基础上增加或者减少秒和毫秒的值。
示例:
QTime time(6,10,10,10); //构建QTime对象
time=time.addMSecs(100); //增加100毫秒
time=time.addSecs(-100); //减少100秒
qDebug()<<time.toString(“AP h:m:s:z”); //输出结果:”上午 6:8:30:110″
4.判断时间的合法性
booQTime::isNull() const //判断时间是否为空。为空将返回true
booQTime::isValid() const //判断时间是否有效。有效将返回true
QTime还提供了一个isValid静态函数用于判断指定时间的可用性:
booQTime::isValid(int h, int m, int s, int ms = 0)
示例:
QTime::isValid(21, 10, 30); // returns true
QTime::isValid(22, 5, 62); // returns false
5.获取时间
int QTime::hour() const //小时:范围 0 to 23
int QTime::minute() const //分钟:范围 0 to 59
int QTime::second() const //秒 :范围 0 to 59
int QTime::msec() const //毫秒:范围 0 to 999
示例:
QTime time(6,10,11,12);
qDebug()<<time.hour(); //输出结果:6
qDebug()<<time.minute();//输出结果:10
qDebug()<<time.second();//输出结果:11
qDebug()<<time.msec(); //输出结果:12
6.获取当前时间的毫秒数
int msecsTo(const QTime &t) const
输出范围在-86400000和86400000ms之间。
7.设置时间
boosetHMS(int h, int m, int s, int ms = 0)
8.将当前时间转为字符串返回
QString toString(const QString &format) const
QString toString(Qt::DateFormat format = Qt::TextDate) const
ToString是一个 重载函数,可以传入两种不同的格式进行转换时间。下面介绍两种传入的格式。
format格式说明:
h
显示小时(0-23)
hh
显示两位数的小时(00-23)
m
显示分钟(0-59)
mm
显示分钟(00-59)
s
显示秒(0-59)
ss
显示秒(00-59)
z
显示毫秒(0-999)
zzz
显示毫秒(000-999)
AP
大写字母表示上午/下午(AM/PM)
ap
小写字母表示上午/下午(am/pm)
Qt::DateFormat常用的枚举介绍:
Qt::TextDate
时间样式:”22:10:11″
Qt::ISODate
时间样式:”22:10:11″
Qt::SystemLocaleShortDate
时间样式:”22:10″
Qt::SystemLocaleLongDate
时间样式:”22:10:11″
图2-6-6 时间显示样式
9.测量某一段经过的时间
void QTime::start()
int QTime::restart()
int QTime::elapsed() const
start():开始计时。
restart():重新开始计时,将经过的时间设置为当前时间,并返回经过的毫秒数。
elapsed():返回开始启动后经过的毫秒数。
一般使用start()和elapsed()测量某一段经过的时间。restart()可以用来重复测量。
测量某段代码消耗的时间:
QTime time;
time.start(); //开始计时
for(int i=0;i<10000;i )
{
for(int j=0;j<10000;j )
{
}
}
int count=time.elapsed(); //读出经过的时间
qDebug()<<“消耗的时间:”<<count<<“ms”; //输出结果:消耗的时间: 242 ms
使用restart()循环测量示例:
QTime time;
time.start(); //开始计时
for(int i=0;i<10000;i )
{
for(int j=0;j<10000;j )
{
}
}
//输出第1次测量结果
qDebug()<<“消耗的时间:”<<time.restart()<<“ms”;
for(int i=0;i<10000;i )
{
for(int j=0;j<10000;j )
{
}
}
//输出第2次测量结果
qDebug()<<“消耗的时间:”<<time.restart()<<“ms”; //输出结果:消耗的时间: 242 ms
for(int i=0;i<10000;i )
{
for(int j=0;j<10000;j )
{
}
}
//输出第3次测量结果
qDebug()<<“消耗的时间:”<<time.restart()<<“ms”; //输出结果:消耗的时间: 242 ms
2.6.4 Qtimer定时器介绍
QTimer类提供了定时器功能,在指定的时间超时之后可以发出超时信号,可以单次或者重复定时。 QTimer使用方法比较简单:先创建一个QTimer定时器,使用start()函数设定定时的时间并开始计时。然后将timeout()信号连接到适当的槽函数。当定时的时间到达后,QTimer将会发出timeout()信号。注意:定时器的时间单位为毫秒(ms)。
创建一个重复的定时器:
QTimer *timer = new QTimer(this); //创建定时器
connect(timer, SIGNAL(timeout()), this, SLOT(update())); //关联槽函数
timer->start(1000); //1000毫秒
创建成功后,每隔1000毫秒timer定时器将会发出一个timeout()信号。
下面介绍几个QTimer常用的成员函数。
1.修改定时器的时间
int interval() const //返回当前定时器的超时时间
void setInterval(int msec) //设置定时器的超时时间
2.设置定时器单发和重复属性
booisSingleShot() const
void setSingleShot(boosingleShot) //设置定时器的单发和重复属性
默认情况下,定时器属性为false,支持重复超时触发。设置singleShot属性为true之后,定时器只会触发一次超时信号。
3.定时器启动与停止
[slot] void QTimer::start() //启动定时器
[slot] void QTimer::start(int msec) //启动定时器,并设置超时时间
[slot] void QTimer::stop() //停止定时器
至此,第二章结束。
技术合作与咨询