在Qt中,为了方便日期和时间的表示和相关操作,为我们提供了两个类。一个是QDate,表示年月日形式的日期;一个是QTime,表示时分秒形式的时间。今天,就来学习一下这两个类的使用方法。
QDate类已格里高里历为准表示年月日的日期。该类可以从系统时钟里读取当前日期,并且为我们提供了大量方便的日期操作,比如日期的加减。
通常我们可以使用特定的年月日数字来构造一个该来的对象,让给在进行其他计算。其构造函数声明如下:
QDate()
QDate(int y, int m, int d)
要注意的是,该构造函数可以接受两位数字的年份。即0-99.
除了使用构造函数进行显式构造外,我们在程序中还可以使用另外两种方便的方式。一个是使用静态成员函数currentDate() ,该函数会使用系统时钟里的日期创建一个QDate对象;另一个是使用静态函数fromString() 函数,该函数会按照所传入的表示日期的字符串即相应的格式字符串来创建出一个QDate对象。这两个函数声明如下:
QDate currentDate()
QDate fromString(const QString &string, const QString &format)
d | 表示天的数字,范围为 1~31,没有前置的0 |
dd | 表示天的数字,有前置的0,范围为01~31 |
ddd | 表示星期的简写,即Mon~Sun |
dddd | 表示星期的全写,即Monday~Sunday |
M | 表示月份的数字,没有前置的0,范围为1~12 |
MM | 表示月份的数字,有前置的0,范围为01~12 |
MMM | 表示月份的简写,范围为Jan~Dec |
MMMM | 表示月份的全写,范围为January~December |
yy | 表示两位数字的年份,即00~99 |
yyyy | 表示四位数字的年份,如2017 |
另外还要注意,QDate里的年月日都有相应的默认值。Year默认值为1900,Month默认值为1,Day默认值为1。比如:
QDate::fromString("1.30", "M.d"); // 1900 1.30
QDate::fromString("20000110", "yyyyMMdd"); // 2000 01 10
QDate::fromString("20000110", "yyyyMd"); // 2000 1 10
与fromString() 相对的,QDate还提供了一个toString() 方法,可以将QDate对象表示的日期按一定格式转化为一个字符串表示。
QString toString(const QString &format) const
其中,format与fromString()类似。比如
QDate date(2017,3,21)
date.toString("yyyy-MM-dd") //2017-03-21
注意,toString() 里的format中必须有分隔符,即"yyyyMMdd"是不支持的。
除了这些创建对象的函数,QDate还为我们提供了很多操作QDate对象的方法,比如判断日期是否有效的isValid(),判断某个年份是否是闰年的isLeapYear()等等。在此,就不一一细说了,有需要的同学,可以参考帮助文档,也都非常的简单。
类似于QDate表示了年月日的日期,QTime则表示了自凌晨以来的时分秒及毫秒的时间。该类从系统时钟里读取当前时间并测量逝去时间的跨度。QTime使用24小时制来表示时间,并且不关心时区和夏令时。
其通常的构造方式也和QDate类似,可以使用相关构造函数直接传入时分秒的数字进行直接构造,也可以使用静态函数currentTime() 和 fromString() 按一定格式进行构造。但是,QTime表示的时间的精度取决于操作系统本身的精度,并不是所有的系统都能提供1ms级别的精度。
我们还是先来看一下常用的创建QTime对象的方法:
QTime::QTime()
QTime::QTime(int h, int m, int s = 0, int ms = 0)
其中默认构造函数,创建出一个空(null)对象。注意,空时间对象和QTime(0,0,0,0)的区别。一个空时间对象的isNull() 返回true,isValid() 返回false。而QTime(0,0,0,0)是一个有效的时间,它表示零点。
若为构造函数传入了相关参数,则传入的参数必须满足一定要求。即 h必须在0~23之间,m和s必须在0~59之间,ms必须在0~999之间。
QTime currentTime()
QTime fromString(const QString &string, const QString &format)
其中,format中可以使用的格式及含义如下:
h | 没有前置0的小时数字,即0~23,或者 1~12,如果显示AM/PM的话 |
hh | 有前置0的小时数字,即00~23,或者01~12,如果显示AM/PM的话 |
m | 没有前置0的分钟数字,0~59 |
mm | 有前置0的分钟数字,00~59 |
s | 没有前置0的秒数,0~59 |
ss | 有前置0的秒数,00~59 |
z | 没有前置0的毫秒,0~999 |
zzz | 有前置0的毫秒,000~999 |
AM/PM | 显示AM/PM |
am/pm | 显示am/pm |
QTime time = QTime::fromString("1.30", "m.s");
// time is 00:01:30.000
QString toString(const QString &format) const
其中,参数format与上面讲的类似。比如:
QTime time(14,13,9,42)
time.toString("hh:mm:ss.zzz") //14:13:09.042
int elapsed() const
int restart()
void start()
elapsed() 返回自从上次调用start() 或 restart() 之后的毫秒数。注意,如果自从上次调用start() 之后,超过了24小时,那么该数字会回归到0,从新计数。
start() 会将该对象设置为当前时间,然后开始计时。restart() 将该对象设置为当前时间,然后返回自从上次调用start() 或 restart() 后所经历的毫秒数。该方法可以原子性的完成这两件事,所以非常适合重复计数。即先调用一下start() 开启计时,之后每次计时就调用一下restart() 即可。但和elapsed() 类似,在上次调用start() 或 restart() 24小时后,该计时会回归到0。
除此之外,QTime的其他方法和QDate都是类似的,比如对时间的加减,计算两个时间的差,判断时间对象是否有效的isNull()、isValid()等等。
最后,其实在Qt中除了QDate和QTime之外,还为我们提供了QDateTime类。顾名思义,该类是QDate和QTime功能的结合,可以使用一个对象同时表示日期和时间。其使用方式也和上面讲的两个类大同小异,在此就不展开讲解了,有需要的同学,可以自行学习Qt帮助文档即可。