Qt学习-17 <QDateTime、QDate、QTime>

——  均为自学记录,如有错误请指正


本文参考  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用法类似。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值