—— 均为自学记录,如有错误请指正
本文参考 Qt应用开发-时间类、QDataTime详解、Qt日期操作、QDataTime
一、简述
时间类QDateTime、QDate、QTime、QTimeZone保存了Qt的时间、日期、时区信息,常用的时间类部件都会用到这些数据结构,常用概念有年、月、日、时、分、秒、毫秒和时区,时间和时区就关系到时间戳和UTC的概念。
QDateTime类基于QDate和QTime类,并提供了更多的功能和操作符重载。
1. 显示区别:
- QTime:时间类型,只表示时间,如15:23:13;
- QDate:日期类型,只表示日期,如2017-4-5;
- QDateTime:日期时间类型,表示日期和时间,如2017-03-23 08:12:43;
2. 控件:
- QTimeEdit:编辑和显示时间的组件;
- QDateEdit:编辑和显示日期的组件;
- QDateTimeEdit:编辑和显示日期时间的组件;
- QCalendarWidget:一个用日历形式选择日期的组件。
二、QDateTime类
1. 简述
- QDateTime类是QDate和QTime的组合,用来显示时间和日期。可以与QTimeZone类一起描述与本地时间、UTC时间、UTC的指定偏移量或指定时区相关的日期时间。
- QDateTime时间戳是qint64类型,所以这将日期范围限制在+/- 2.92亿年左右。在创建具有极端值的QDateTime时,必须小心,以免溢出存储空间。支持的值的确切范围取决于时间戳和时区。
2. 主要属性:
- datetime:日期时间;
- date:日期;设置datetime时会自动改变date;同时,设置date时,也会自动改变datetime中的日期;
- time:时间;和date类似,设置datetime和time时会互相改变对方的值;
- maximumDateTime、minimumDateTime:最大、最小时间日期;
- maximumTime、minimumTime:最大、最小时间;
- currentSection:当前输入光标所在的时间日期数据段,是枚举类型QDateTimeEdit::Section。QDateTimeEdit显示日期时间数据时分为多个段,单击编辑框右侧的按钮可以修改当前段的值。如输入光标在Year Section段,就修改“年”的值;
- currentSectionIndex:用序号表示输入光标所在的段;
- calendarPopup:是否允许弹出日历框;取值为true时,右侧的输入按钮变为下拉按钮,单击按钮时出现一个日历框,用于在日历上选择日期。对于QTimeEdit,此属性无效;
- displayFormat:格式化显示;如“yyyy-MM-dd HH:mm:ss”。
注:三、QDateTime控件中详解
3. QDateTime和QString的互相转换:
① QDateTime 转换成QString:
- 例:
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"));
}
- 先用QDateTime类的静态函数currentDateTime()获取当前日期时间,并赋值给变量curDateTime。
- 然后用curDateTime变量设置界面上的3个Date、Time、DateTime,利用QDateTime的time()、date()分别提取time和date。
- 将curDateTime表示的日期时间转换为字符串,然后在LineEdit编辑框上显示。转换时使用了QDateTime的toString()函数,函数参数指定了显示Time、Date、DateTime的格式:
QString QDateTime :: toString ( QString format )
- 它将日期按照format指定的格式转换为字符串。format是一个字符串,包含一些特定的字符,表示Date或Time的各个部分,下表显示了常用format:
- 例:
time_str = now.toString("hh:mm:ss");
date_str = now.toString("yyyy-MM-dd");
datetime_str = now.toString("yyyy-MM-dd hh:mm:ss");
② QString转换成QDateTime:
- 将QString转换为QTime、QDate、QDateTime类型,需要使用静态函数QDateTime::fromString()
QDateTime QDateTime :: fromString( string , format )
//第一个参数string是DateTime字符串
//第二个参数format是格式,按照之前的格式表定义。
QString str = ui->editxxx->text();//从某个QLineEdit中读取输入的QString
...//对str做处理
QDateTime datetime = QDateTime :: fromString( str , "yyyy-MM-dd hh:mm:ss" );//QString→QDateTime
//显示QDateTime
ui->datetimeEdit->setDateTime(datetime);
- 例:
在程序运行时,手工修改“日期时间”后面文本框editDateTime中的DateTime字符串,单击“设置日期时间”按钮,可以将文本框中的QString转换为QDateTime变量,并设置为左侧DateTimeEdit组件的DateTime数据:
void Widget::on_btnSetDateTime_clicked()
{
//QString转换为QDateTime
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);
}
}
4. 创建 QDateTime对象 的方法
要创建QDateTime对象,可以使用构造函数或静态成员函数。
以下是一些常用的创建QDateTime对象的方法:
- 使用当前日期和时间创建对象
QDateTime currentDateTime = QDateTime::currentDateTime();
- 使用特定日期和时间创建对象
QDateTime customDateTime(QDate(2023, 7, 15), QTime(10, 30, 0));
5. 获取当前(前一天)时间&时间戳
- 获取当前时间并将当前时间转化为时间戳
QDateTime begin_time = QDateTime::currentDateTime();//获取系统现在的时间
uint stime = begin_time.toTime_t();
- 获取时间的前一天
QString str = "2019-03-01 12:00:01";
QDateTime begin_time = QDateTime::fromString(str, "yyyy-MM-dd hh:mm:ss");
QString str= begin_time .addDays(-1).toString("yyyy-MM-dd hh:mm:ss");//获取前一天时间,负数为之前的时间正数为之后的时间同时还有addMonths(int months)、addYears(int years)、addSecs(qint64 secs)、addMSecs(qint64 msecs) 等
6. 访问 和 设置 日期时间值
QDateTime类提供了多个成员函数来访问和设置日期时间值。以下是一些常用的函数:
- 访问日期和时间
QDate date = dateTime.date();
QTime time = dateTime.time();
- 设置日期和时间
dateTime.setDate(QDate(2023, 7, 15));
dateTime.setTime(QTime(10, 30, 0));
7. 格式化 日期时间
QDateTime类提供了功能强大的格式化函数,使您能够将日期时间以不同的格式显示出来。
- 将日期时间转换为字符串
QString formattedDateTime = dateTime.toString("yyyy-MM-dd hh:mm:ss");
- 使用预定义的格式
QString formattedDateTime = dateTime.toString(Qt::ISODate); // ISO 8601格式
8. 比较和计算日期时间
QDateTime类提供了用于比较和计算日期时间的函数和操作符重载。
- 比较两个日期的时间
bool result = dateTime1 < dateTime2;
- 计算日期时间的差值
qint64 seconds = dateTime1.secsTo(dateTime2); // 计算两个日期时间之间的秒数差
9. 时区的处理
QDateTime类还支持时区的处理。您可以将日期时间从一个时区转换到另一个时区,并获取特定时区的当前日期时间。
- 转换时区
QDateTime convertedDateTime = dateTime.toTimeZone(QTimeZone("America/New_York"));
- 获取特定的当前日期时间
QDateTime currentDateTime = QDateTime::currentDateTime().toTimeZone(QTimeZone("Asia/Tokyo"));
三、QDateTimeEdit 控件
1. 设置指定时间
//将时间设置为2023年12月14日13点30分
//方式一:
QDateTimeEdit *dateTimeEdit = new QDate TimeEdit();
dateTimeEdit->setDateTime(QDateTime(QDate(2023,12,14),QTime(13,30,)));
//方式二
ui->dateTimeEdit->setDateTime(QDateTime(QDate(2023,12,14),QTime(13,30,)));
2. 设置为当前时间
//方法一:
QDateTimeEdit *dateTimeEdit = new QDate TimeEdit();
dateTimeEdit->setDateTime(QDateTime::currentDateTime());
//方法二:
ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime());
3. 设置日期时间格式
ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
ui->dateTimeEdit->setDisplayFormat("yyyy/MM/dd HH-mm-ss");
ui->dateTimeEdit->setDisplayFormat("yyyy.M.d");
ui->dateTimeEdit->setDisplayFormat("H:mm");
4. 设置范围
dateEdit->setMinimumDate(QDate::currentDate().addDays(-365)); // -365天
dateEdit->setMaximumDate(QDate::currentDate().addDays(365)); // +365天
5. 获取时间
QDate date = dateEdit->date(); // 日期
QDateTime dateTime = dateEdit->dateTime(); // 日期时间
QDate maxDate = dateEdit->maximumDate(); // 最大日期
QDateTime maxDateTime = dateEdit->maximumDateTime(); // 最大日期时间
QTime maxTime = dateEdit->maximumTime(); // 最大时间
QDate minDate = dateEdit->minimumDate(); // 最小日期
QDateTime minDateTime = dateEdit->minimumDateTime(); // 最小日期时间
QTime minTime = dateEdit->minimumTime(); // 最小时间
// 用Section 获取各部分对应的值
QString strYear = dateEdit->sectionText(QDateTimeEdit::YearSection);
QString strMonth = dateEdit->sectionText(QDateTimeEdit::MonthSection);
QString strDay = dateEdit->sectionText(QDateTimeEdit::DaySection);
QString strHour = dateEdit->sectionText(QDateTimeEdit::HourSection);
QString strMinute = dateEdit->sectionText(QDateTimeEdit::MinuteSection);
QString strSecond = dateEdit->sectionText(QDateTimeEdit::SecondSection);
6. 弹出日历
/*
注意:日历是对应的是QDate,而非QTime;
所以QDateEdit、QDateTimeEdit可以使用,
而QTimeEdit并不能使用。
*/
dateEdit->setCalendarPopup(true); // 取true 日历弹出
四、QDate类
此类表示一个特定的日期,而不考虑日历、语言环境或创建时使用的其他设置或系统提供的设置。
- 提供year()、month()和day()函数提供对年、月和日数字的访问。
- 提供dayOfWeek()和dayOfYear()显示日期在一周中和一年中的第几天。
- daysInMonth()和daysInYear()函数分别返回该日期的月份和年份中有多少天。
- addDays()加减时间、daysTo()比较时间,toString()函数以文本格式提供相同的信息、静态函数传入字符串构造类等这些和QDateTime用法类似。
五、QTime类
此类包含一个时钟时间,它可以表示为从午夜开始的小时、分钟、秒和毫秒数。它提供了比较时间和通过添加毫秒数来操纵时间的函数。
- QTime使用24小时时钟格式,它没有AM/PM的概念。
- 提供hour()、minute()、second()和msec()函数对时间的小时、分钟、秒和毫秒数的访问。
- addSecs()加减时间,secsTo()比较时间、toString()函数以文本格式提供相同的信息、静态函数传入字符串构造类类等这些和QDateTime用法类似。