qt日期时间数据

日期和时间是经常遇到的数据类型。Qt 定义了 3 个类用于表示和处理日期时间数据。

• QTime:表示时间数据的类,时间数据如 12:04:35。

• QDate:表示日期数据的类,日期数据如 2021-9-15。

• QDateTime:表示日期时间数据的类,日期时间数据如 2021-09-16 17:22:43。

这 3 个类都没有父类,它们只用于存储日期时间数据,并定义接口函数用于数据处理。为了在界面上输入和显示日期时间数据,Qt 定义了几个用于日期时间数据处理的界面组件类。在 Qt Designer 组件面板的 Input Widgets 和 Display Widgets 分组里可以找到这几个组件类。

• QTimeEdit:编辑和显示时间的组件类。

• QDateEdit:编辑和显示日期的组件类。

• QDateTimeEdit:编辑和显示日期时间的组件类。

• QCalendarWidget:一个用日历形式显示和选择日期的组件类。

一. 表示日期时间数据的类

1.QTime 类

QTime 是用于存储和操作时间数据的类,时间数据包含小时、分钟、秒、毫秒。QTime 总是使用 24小时制,不区分 AM/PM。QTime 有一种构造函数可以初始化时间数据,函数定义如下:

QTime::QTime(int h, int m, int s = 0, int ms = 0) //参数 h、m、s、ms 分别表示小时、分钟、秒、毫秒。

还可以使用静态函数 QTime::currentTime()创建一个 QTime 对象,并且将其初始化为系统当前时间。

QTime 类的一些主要接口函数如下表所示。这些函数有完整的函数原型定义,其中某些函数是 overload 型函数,表中只给出常用的一种参数形式,“当前时间”指的是 QTime 对象所表示的时间。

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 秒之后的时间。s 为正表示延后,s 为负表示提前
int secsTo(QTime t)返回当前时间与一个 QTime 对象 t 相差的秒数
QString toString(const QString &format)将当前时间按 format 设置的格式转换为字符串
QTime TM1(13,24,5); //定义变量,初始化设置时间
 QString str= TM1.toString("HH:mm:ss"); 
 qDebug("Original time= %s", str.toLocal8Bit().data()); 
 QTime TM2= TM1.addSecs(150); //延后 150 秒
 str= TM2.toString("HH:mm:ss"); 
 qDebug("150s later, time= %s", str.toLocal8Bit().data()); 
 TM2= QTime::currentTime(); //获取当前时间
 str= TM2.toString("HH:mm:ss zzz"); 
 qDebug("Current time= %s", str.toLocal8Bit().data()); 
 qDebug("Hour= %d", TM2.hour()); 
 qDebug("Minute= %d", TM2.minute()); 
 qDebug("Second= %d", TM2.second()); 
 qDebug("MSecond= %d",TM2.msec()); 

输出结果如下:

Original time= 13:24:05 
150s later, time= 13:26:35 
Current time= 01:20:27 997 
Hour= 1 
Minute= 20 
Second= 27 
MSecond= 997 

2.QDate 类

QDate 是用于存储和操作日期数据的类。日期数据包含年、月、日数据。可以在定义 QDate 变量时初始化日期数据,也可以使用静态函数 QDate::currentDate()获取系统的当前日期创建一个 QDate 变量。

QDate 类定义了很多接口函数来对日期数据进行处理,QDate 类的主要接口函数如下表所示。这些函数有完整的函数原型定义,其中某些函数是 overload 型函数,表中只给出常用的一种参数形式,“当前日期”指的是 QDate 变量所表示的日期。

QDate 类的主要接口函数
函数原型功能
int year()返回当前日期的年数据
int month()返回当前日期的月数据,数值为 1~12
int day()返回当前日期的日数据,数值为 1~31
int dayOfWeek()返回当前日期是星期几,数字 1 表示星期一,数字 7 表示星期天
int dayOfYear()返回当前日期在一年中是第几天,数字 1 表示第一天
bool setDate(int year, int month, int day)设置日期的年、月、日数据
void getDate(int *year, int *month, int *day)通过指针变量,返回当前日期的年、月、日数据
QDate addYears(int nyears)返回一个 QDate 变量,其日期是在当前日期基础上加 nyears 年
QDate addMonths(int nmonths)返回一个 QDate 变量,其日期是在当前日期基础上加 nmonths 个月
QDate addDays(qint64 ndays)返回一个 QDate 变量,其日期是在当前日期基础上加 ndays 天
qint64 daysTo(QDate d)返回当前日期与一个 QDate 变量 d 相差的天数。如果 d 值早于当前日 期,返回值为负
QString toString(const QString &format)将当前日期按 format 设置的格式转换为字符串

QDate 还有一个静态函数 isLeapYear()可以判断某年是否为闰年,这个静态函数定义如下:

bool QDate::isLeapYear(int year) 

测试代码:

 QDate DT1(2021,7,6); //初始化日期
 QString str= DT1.toString("yyyy-MM-dd"); 
 qDebug("DT1= %s", str.toLocal8Bit().data()); 
 QDate DT2; 
 DT2.setDate(2021,8,25); //设置日期
 str= DT2.toString("yyyy-MM-dd"); 
 qDebug("DT2= %s",str.toLocal8Bit().data()); 
 qDebug("Days between DT2 and DT1= %d", DT2.daysTo(DT1));//DT2 与 DT1 相差的天数
 DT2= QDate::currentDate(); //获取当前日期
 str= DT2.toString("yyyy-MM-dd"); 
 qDebug("Current date= %s", str.toLocal8Bit().data()); 
 qDebug("Year= %d", DT2.year()); 
 qDebug("Month= %d", DT2.month()); 
 qDebug("Day= %d", DT2.day()); 
 qDebug("Day of week= %d",DT2.dayOfWeek()); //1 表示星期一,7 表示星期天

运行输出:

DT1= 2021-07-06 
DT2= 2021-08-25 
Days between DT2 and DT1= -50 
Current date= 2021-08-29 
Year= 2021 
Month= 8 
Day= 29 
Day of week= 7 

3.QDateTime 类

QDateTime 是表示日期时间数据的类,包含日期数据和时间数据。QDateTime 综合了日期和时间的操作, 很多函数与QDate 和 QTime 的相似。QDateTime 类的主要接口函数如下表所示, 与QDate 和 QTime 相似的一些函数没有列出。这些函数有完整的函数原型定义,其中某些函数是 overload 型函数,表中只给出常用的一种参数形式。

QDateTime 类的主要接口函数
函数原型功能
QDate date()返回当前日期时间数据的日期数据
QTime time()返回当前日期时间数据的时间数据
qint64 toMSecsSinceEpoch()返回与 UTC 时间 1970-01-01T00:00:00.000 相差的毫秒数
void setMSecsSinceEpoch(qint64 msecs)设置与 UTC 时间 1970-01-01T00:00:00.000 相差的毫秒数 msecs 作为 当前的日期时间数据
qint64 toSecsSinceEpoch()返回与 UTC 时间 1970-01-01T00:00:00.000 相差的秒数
void setSecsSinceEpoch(qint64 secs)设置与 UTC 时间 1970-01-01T00:00:00.000 相差的秒数 secs 作为当前 的日期时间数据
QString toString(const QString &format)将当前日期时间按 format 设置的格式转换为字符串
QDateTime toUTC()将当前时间转换为 UTC 时间

QDateTime 有两个静态函数可返回系统当前时间,这两个静态函数定义如下:

QDateTime QDateTime::currentDateTime() //返回系统的当前日期时间,本地时间
QDateTime QDateTime::currentDateTimeUtc() //返回系统的当前日期时间,UTC 时间

测试代码:

QDateTime DT1= QDateTime::currentDateTime(); //系统当前日期时间
 QString str= DT1.toString("yyyy-MM-dd hh:mm:ss"); 
 qDebug("DT1= %s",str.toLocal8Bit().data()); 
 QDate dt= DT1.date(); //日期部分
 str= dt.toString("yyyy-MM-dd"); 
 qDebug("DT1.date()= %s",str.toLocal8Bit().data()); 
 QTime tm= DT1.time(); //时间部分
 str= tm.toString("hh:mm:ss zzz"); 
 qDebug("DT1.time()= %s",str.toLocal8Bit().data()); 
 qint64 MS= DT1.toSecsSinceEpoch(); //转换为秒数
 qDebug("DT1.toSecsSinceEpoch()= %lld",MS); 
 MS += 120; 
 DT1.setSecsSinceEpoch(MS); //加 120 秒以后
 str= DT1.toString("yyyy-MM-dd hh:mm:ss"); 
 qDebug("DT1+120s= %s",str.toLocal8Bit().data()); 

测试结果:

DT1= 2021-08-29 01:55:10 
DT1.date()= 2021-08-29 
DT1.time()= 01:55:10 870 
DT1.toSecsSinceEpoch()= 1630173310 
DT1+120s= 2021-08-29 01:57:10 

4.日期时间数据与字符串的转换

QTime、QDate 和 QDateTime 都有一个函数 toString(),用于将当前的日期时间数据转换为字符串。例如,QDateTime 的函数 toString()的一种常用的函数原型定义如下:

QString QDateTime::toString(const QString &format, QCalendar cal = QCalendar())

其中,format 是格式化字符串,cal 是日历类型,使用默认值就可以。

QTime、QDate 和 QDateTime 都有静态函数 fromString(),用于将字符串转换为相应类的对象。 例如,静态函数 QDateTime::fromString()的一种常用的函数原型定义如下:

QDateTime QDateTime::fromString(const QString &string, const QString &format, 
 QCalendar cal = QCalendar()) 

其中,string 是字符串表示的日期时间,format 是日期时间字符串的格式定义,cal 是日历类型。

函数 toString()和 fromString()中的参数 format 是格式化字符串,包含一些特定的字符,用于表示日期和时间的各个部分.

用于表示日期时间的常用格式字符及其含义
格式字符含义
d天,不补零显示,1~31
dd天,补零显示,01~31
M月,不补零显示,1~12
MM月,补零显示,01~12
yy年,两位显示,00~99
yyyy年,4 位显示,如 2016
h小时,不补零显示,0~23 或 1~12(如果显示 AM/PM)
hh小时,补零两位显示,00~23 或 01~12(如果显示 AM/PM)
H小时,不补零显示,0~23(即使显示 AM/PM)
HH小时,补零显示,00~23(即使显示 AM/PM)
m分钟,不补零显示,0~59
mm分钟,补零显示,00~59
s秒,不补零显示,0~59
ss秒,补零显示,00~59
z毫秒,不补零显示,0~999
zzz毫秒,补零 3 位显示,000~999
AP或A使用 AM/PM 显示
ap或a使用 am/pm 显示

在设置日期时间字符串的显示格式时,还可以使用填字符,甚至使用汉字,例如:

QDate DT(2021,8,29); 
QString str= DT.toString("yyyy 年 MM 月 dd 日"); 

这样得到的字符串 str 的内容是“2021 年 08 月 29 日”.

二. 日期时间数据的界面组件

1.QDateTimeEdit 及其子类

Qt Designer 的 Input Widgets 分组里有 3 个用于编辑日期时间数据的界面组件。QDateTimeEdit 是 QTimeEdit 和 QDateEdit 的父类,而 QDateTimeEdit 的父类是 QAbstractSpinBox。所以,日期时间编辑框的特性与 QSpinBox 的有些相似,只是日期时间 编辑框里提供了多个输入段,例如,QTimeEdit 有小时、分钟、秒 3 个输入段,当光标落在某个段 时,点击编辑框右端的上下调节按钮,就可以调节这个段的数值。

 QDateTimeEdit 的一些属性的含义如下:

• currentSection:光标所在的日期时间输入段,是枚举类型 QDateTimeEdit::Section。

• currentSectionIndex:用序号表示的光标所在的段。

• calendarPopup:是否允许弹出一个日历选择框。当设置为 true 时,编辑框右端的上下调节按钮变成一个下拉按钮,点击按钮时会出现一个日历选择框,用于在日历上选择日期。

• displayFormat:日期时间数据的显示格式.

QDateTimeEdit 的常用接口函数就是读取或设置日期时间数据的函数,这些函数定义如下:

QDateTime dateTime() //返回编辑框的日期时间数据
void setDateTime(const QDateTime &dateTime) //设置日期时间数据
QDate date() //返回编辑框的日期数据
void setDate(QDate date) //设置日期数据
QTime time() //返回编辑框的时间数据
void setTime(QTime time) //设置时间数据

QDateTimeEdit 有如下 3 个信号,信号被发射的时机见注释。

void dateChanged(QDate date) //日期发生变化时
void timeChanged(QTime time) //时间发生变化时
void dateTimeChanged(const QDateTime &datetime) //日期或时间发生变化时

QDateEdit 和 QTimeEdit 都是 QDateTimeEdit 的子类,它们也都具有这些接口函数,区别是它们单独用于输入日期或时间。

2.QCalendarWidget 类

QCalendarWidget 是一个用于选择日期的日历组件。 在日历上选择年和月后,就会显示该月的月历,在月历上点击某一天,就可选择具体的日期。

QCalendarWidget 的几个常用接口函数定义如下,函数的作用见注释。

void showToday() //显示系统当前日期的月历
void showSelectedDate() //显示所选日期的月历
QDate selectedDate() //返回选择的日期
void setSelectedDate(QDate date) //设置选择的日期

QCalendarWidget 定义了 4 个信号,其函数原型定义如下,信号发射时机见注释。

void activated(QDate date) //在日历组件上按 Enter 键,或双击一个日期时
void clicked(QDate date) //在日历组件上点击一个有效日期时
void currentPageChanged(int year, int month) //当前显示的月历变化时
void selectionChanged() //当前选择的日期变化时

选择的日期变化时,QCalendarWidget 会发射 selectionChanged()信号,可以通过点击实现选择 日期变化,或者调用函数 setSelectedDate()实现选择日期变化。

三. 示例程序功能实现

示例的窗口基类是 QWidget,界面布置如图:

void Widget::on_btnGetTime_clicked() 
{//“读取当前日期时间”按钮
 QDateTime curDateTime= QDateTime::currentDateTime(); //读取当前日期时间
 ui->timeEdit->setTime(curDateTime.time()); //设置时间
 ui->editTime->setText(curDateTime.toString("hh:mm:ss")); 
 ui->dateEdit->setDate(curDateTime.date()); //设置日期
 ui->editDate->setText(curDateTime.toString("yyyy-MM-dd")); 
 ui->dateTimeEdit->setDateTime(curDateTime); //设置日期时间
 ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss")); 
} 
void Widget::on_btnSetTime_clicked() 
{//“设置时间 fromString”按钮
 QString str= ui->editTime->text(); //将取字符串表示的时间数据
 str= str.trimmed(); //去掉可能的多余空格
 if (!str.isEmpty()) 
 { 
 QTime tm= QTime::fromString(str,"hh:mm:ss"); //将字符串转换为 QTime 数据
 ui->timeEdit->setTime(tm); //设置时间
 } 
} 
void Widget::on_btnSetDate_clicked() 
{//“设置日期 fromString”按钮
 QString str= ui->editDate->text(); //读取字符串表示的日期
 str= str.trimmed(); 
 if (!str.isEmpty()) 
 { 
 QDate dt= QDate::fromString(str,"yyyy-MM-dd"); //将从字符串转换为 QDate 数据
 ui->dateEdit->setDate(dt); //设置日期
 } 
} 
void Widget::on_btnSetDateTime_clicked() 
{//“日期时间 fromString”按钮
 QString str= ui->editDateTime->text(); //读取字符串表示的日期时间
 str= str.trimmed(); 
 if (!str.isEmpty()) 
 { 
 QDateTime datetime= QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss"); 
 ui->dateTimeEdit->setDateTime(datetime); //设置日期时间
 } 
} 
void Widget::on_calendarWidget_selectionChanged() 
{//日历组件的 selectionChanged()信号的槽函数
 QDate dt= ui->calendarWidget->selectedDate(); //读取选择的日期时间
 QString str= dt.toString("yyyy 年 M 月 d 日"); 
 ui->editCalendar->setText(str); 
} 

QTime、QDate、QDateTime 各自都有一个静态函数 fromString(),用于将字符串按照格式定义转换为相应的 QTime、QDate、QDateTime数据。在使用静态函数 fromString()时一定要注意日期时间字符串与格式定义的对应关系,日期时间字符串中不能出现与格式定义不匹配的内容,否则会导致转换失败。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值