Qt 日期时间数据

前言


日期和时间是经常遇到的数据类型,例如以下显示的类型:

  • 日期数据:2019/8/12,2023/7/16,
  • 时间数据:13:10:34,21:45:32

Qt 中定义了 3 个类用于表示和处理日期时间数据:

  • QTime:表示时间数据类型,例如:12:41:16
  • QDate:表示日期数据的类,例如:2023-7-16
  • QDateTime:表示日期时间数据的类,例如:2023-7-16 12:41:16

这 3 个类都没有父类,它们只用于存储日期时间数据,并定义接口函数用于数据处理。

为了在 UI 界面上输入和显示这些日期时间数据,Qt 定义了几个用于日期时间数据处理的界面组件类。在 Qt Designer 组件面板上的 Input Widgets 和 Display Widgets 分组里可以找到这几个组件类:

  • QTimeEdit:编辑和显示时间的组件类
  • QDateEdit:编辑和显示日期的组件类
  • QDateTimeEdit:编辑和显示日期时间的组件类
  • QCalendarWidget:一个用于日历形式显示和选择日期的组件类

表示日期时间数据的类


1. QTime 类

QTime 用于存储和操作时间数据,时间数据包含 小时(h)分钟(m)秒(s)毫秒(ms)

QTime 总是使用使用 24 小时制,不区分 AM/PM

QTime 有一种构造函数可以初始化时间数据,函数定义如下:

QTime::QTime(int h, int m, int s = 0, int ms = 0)

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

QTime QTime::currentTime()

QTime 类的一些主要接口函数如下表所示:

函数原型功能
int hour()返回当前时间的小时数据
int minute()返回当前时间的分钟数据
int second()返回当前时间的秒数据
int msec()返回当前时间的毫秒数据
bool setHMS(int h, int m, int s, int ms=0)设置时间的小时、分钟、秒、毫秒数据
QTime addSecs(int s)返回从当前时间延后/提前 s 秒之后的时间数据。s 为正表示延后,s 为负表示提前
int secsTo(QTime t)返回当前时间与给定的时间对象 t 之间相差的秒数
QString toString(const QString &format)返回当前时间按给定 format 格式转换的字符串
注意:当前时间指的是 QTime 对象

>> 示例:

QTime TM1(13, 24, 5);
QString str1 = TM1.toString("HH:mm:ss");
qDebug("初始时间 = %s", str1.toLocal8Bit().data());
QTime TM2 = QTime::currentTime();
QString str2 = TM2.toString("HH:mm:ss");
qDebug("当前时间 = %s", str2.toLocal8Bit().data());
qDebug("hour = %d", TM2.hour());
qDebug("minute = %d", TM2.minute());
qDebug("second = %d", TM2.second());
qDebug("mscond = %d", TM2.msec());

// 输出结果
// 初始时间 = 13:24:05
// 当前时间 = 10:56:16
// hour = 10
// minute = 56
// second = 16
// mscond = 527

2. QDate 类

QDate 用于存储和操作日期数据,日期数据包含 年(y)月(m)日(d)

可以在定义 QDate 变量时初始化日期数据,函数定义如下:

QDate::QDate(int y, int m, int d)

也可以使用静态函数 QDate::currentDate() 获取系统的当前日期创建一个 QDate 变量

QDate QDate::currentDate()

QDate 类的一些主要接口函数如下表所示:

函数原型功能
int year()返回当前日期的年数据
int month()返回当前日期的月数据,数值为 1~12
int day()返回当前日期的日数据,数值为 1~31
int dayOfWeek()返回当前日期是星期几,数字 1 表示星期一
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)返回当前日期与给定日期之间相差的天数。d 为负,表示早于当前日期
QString toString(const QString &format)将当前日期按 format 设置的格式转换为字符串
bool QDate::isLeapYear(int year)(该函数为静态函数)判断某年是否为闰年
注意:当前日期指的是 QDate

>> 示例:

QDate DT1(2021, 7, 6);
QString str1 = DT1.toString("yyyy-MM-dd");
qDebug("DT1 = %s", str1.toLocal8Bit().data());
QDate DT2(2023, 4, 5);
QString str2 = DT2.toString("yyyy-MM-dd");
qDebug("DT2 = %s", str2.toLocal8Bit().data());
qDebug("DT1 与 DT2 之间相差 %d 天", DT2.daysTo(DT1));
QDate DT3 = QDate::currentDate();
QString str3 = DT3.toString("yyyy-MM-dd");
qDebug("当前日期 = %s", str3.toLocal8Bit().data());
qDebug("year = %d", DT3.year());
qDebug("month = %d", DT3.month());
qDebug("day = %d", DT3.day());
qDebug("今天是星期:%d", DT3.dayOfWeek());

// 输出结果
// DT1 = 2021-07-06
// DT2 = 2023-04-05
// DT1 与 DT2 之间相差 -638 天
// 当前日期 = 2023-07-16
// year = 2023
// month = 7
// day = 16
// 今天是星期:7

3. QDateTime 类

QDateTime 用于操作日期时间,包含日期数据和时间数据

QDateTime 有两个静态函数可返回系统当前时间:

QDateTime currentDateTime()
QDateTime currentDateTimeUtc()

QDateTime 综合了日期和时间的操作,很多函数与 QDate 和 QTime 相似。QDateTime 常用接口函数如下:

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

>> 示例:

QDateTime DT1 = QDateTime::currentDateTime();
QString str1 = DT1.toString("yyyy-MM-dd hh:mm:ss zzz");
qDebug("当前时间 = %s", str1.toLocal8Bit().data());

QDate dt = DT1.date();
QString str2 = dt.toString("yyyy-MM-dd");
qDebug("当前日期 = %s", str2.toLocal8Bit().data());
QTime tm = DT1.time();
QString str3 = tm.toString("hh:mm:ss zzz");
qDebug("当前时间 = %s", str3.toLocal8Bit().data());

qint64 MS = DT1.toMSecsSinceEpoch();
qDebug("距UTC时间相差 %lld 毫秒", MS);
MS += 120;
DT1.setMSecsSinceEpoch(MS);
QString str4 = DT1.toString("yyyy-MM-dd hh:mm:ss zzz");
qDebug("当前时间 + 120s = %s", str4.toLocal8Bit().data());

// 输出结果
// 当前时间 = 2023-07-16 12:15:16 264
// 当前日期 = 2023-07-16
// 当前时间 = 12:15:16 264
// 距UTC时间相差 1689480916264 毫秒
// 当前时间 + 120s = 2023-07-16 12:15:16 384

日期时间数据的常用操作


1. 获取当前日期时间

  • 获取当前日期:QDate TD = QDate::currentDate()
  • 获取当前时间:QTime TM = QTime::currentTime()
  • 获取当前日期和时间:QDateTime DT = QDateTime::currentDateTime()

2. 显示日期时间

  • 输出到控制台(日期时间数据与字符串的转换)
QDateTime DT1 = QDateTime::currentDateTime(); // 定义日期时间变量
QString str1 = DT1.toString("yyyy-MM-dd hh:mm:ss zzz"); // 转换成字符串
qDebug("当前时间 = %s", str1.toLocal8Bit().data()); //使用 tolocal8bit() 获取 QByteArray,再使用 data() 获取 char*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值