百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Qt5 入门教程-第3章 日期和时间(qt5 qml)

ztj100 2025-05-02 22:42 19 浏览 0 评论

大道至简,在 Qt5 C++入门教程的这一部分,我们将讨论时间和日期。

Qt5 有 QDate、QTime 和 QDateTime 类用于处理日期和时间。QDate 类用于处理公历中的日历日期。它具有确定日期、比较或操作日期的方法。QTime 类用于处理时钟时间。它提供了比较时间、确定时间以及各种其他时间操作的方法。QDateTime 类则是将 QDate 和 QTime 对象合并为一个对象的类。

在本章中,我们创建了命令行程序;因此,我们不需要 Qt 图形用户界面(GUI)模块。我们可以在项目文件中添加 QT -= gui 声明。

Qt5 初始化日期和时间对象
日期和时间对象可以通过两种基本方式进行初始化。我们可以在对象构造函数中初始化它们,也可以先创建空对象,之后再用数据填充它们。

  • init.cpp
#include <QTextStream>
#include <QDate>
#include <QTime>

int main(void) {

   QTextStream out(stdout);

   QDate dt1 { 2020, 4, 12 };
   out << "日期是 " << dt1.toString() << endl;

   QDate dt2;
   dt2.setDate(2020, 3, 3);
   out << "日期是 " << dt2.toString() << endl;

   QTime tm1 { 17, 30, 12, 55 };
   out << "时间是 " << tm1.toString("hh:mm:ss.zzz") << endl;

   QTime tm2;
   tm2.setHMS(13, 52, 45, 155);
   out << "时间是 " << tm2.toString("hh:mm:ss.zzz") << endl;
}

我们通过两种方式初始化了日期和时间对象。

QDate dt1 { 2020, 4, 12 };

QDate 对象的构造函数接受三个参数:年份、月份和日期。

out << "日期是 " << dt1.toString() << endl;

日期被打印到控制台。我们使用 toString 方法将日期对象转换为字符串。

QTime tm2;
tm2.setHMS(13, 52, 45, 155);

创建了一个空的 QTime 对象。我们使用 setHMS 方法用数据填充该对象。参数分别是小时、分钟、秒和毫秒。

out << "时间是 " << tm2.toString("hh:mm:ss.zzz") << endl;

我们将 QTime 对象打印到控制台。我们使用了一种特定格式,其中还包括了默认情况下会被省略的毫秒数。

$ ./init
日期是 2020年4月12日 星期日
日期是 2020年3月3日 星期二
时间是 17:30:12.055
时间是 13:52:45.155

Qt5 当前日期和时间
在下面的示例中,我们将当前的本地时间和日期打印到控制台。

  • current_datetime.cpp
#include <QTextStream>
#include <QTime>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QDate cd = QDate::currentDate();
   QTime ct = QTime::currentTime();

   out << "当前日期是: " << cd.toString() << endl;
   out << "当前时间是: " << ct.toString() << endl;
}

注意,该文件不能命名为 time.cpp。

QDate cd = QDate::currentDate();

QDate::currentDate 静态函数返回当前日期。

QTime ct = QTime::currentTime();

QTime::currentTime 静态函数返回当前时间。

out << "当前日期是: " << cd.toString() << endl;
out << "当前时间是: " << ct.toString() << endl;

我们使用 toString 方法将日期和时间对象转换为字符串。

$ ./current 
当前日期是: 2020年12月3日 星期四
当前时间是: 10:21:48

Qt5 比较日期
关系运算符(<,>,=)可用于比较日期。我们可以比较它们在日历中的位置。

  • compare_dates.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QDate dt1 { 2020, 4, 5 };
   QDate dt2 { 2019, 4, 5 };

   if (dt1 < dt2) {

       out << dt1.toString() << " 在 "
            << dt2.toString() << " 之前" << endl;
   } else {

       out << dt1.toString() << " 在 "
            << dt2.toString() << " 之后" << endl;
   }
}

该示例比较了两个日期。

QDate dt1 { 2020, 4, 5 };
QDate dt2 { 2019, 4, 5 };

我们有两个不同的日期。

if (dt1 < dt2) {

    out << dt1.toString() << " 在 "
            << dt2.toString() << " 之前" << endl;
} else {

    out << dt1.toString() << " 在 "
            << dt2.toString() << " 之后" << endl;
}

我们使用小于(<)比较运算符来比较日期,并确定它们中哪一个在日历中更早。

$ ./compare 
2020年4月5日 星期日 在 2019年4月5日 星期五 之后

比较运算符也可以轻松地用于 QTime 和 QDateTime 对象。

Qt5 确定闰年
闰年是包含额外一天的年份。在日历中增加一天的原因是天文年和日历年之间的差异。日历年恰好有 365 天,而天文年,即地球绕太阳公转一圈的时间,是 365.25 天。

这个差异是 6 个小时,这意味着在四年的时间里我们少了一天。因为我们希望我们的日历与季节同步,所以我们每四年在二月增加一天。(存在一些例外情况。)在公历中,闰年的二月有 29 天,而不是通常的 28 天。并且这一年有 366 天,而不是通常的 365 天。

QDate::isLeapYear 静态方法用于确定某一年是否为闰年。

  • leapyear.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QList<int> years({2010, 2011, 2012, 2013, 2014, 2015, 2016, 2020, 2024});

   for (int year: years) {

       if (QDate::isLeapYear(year)) {

           out << year << " 是闰年" << endl;
       } else {

           out << year << " 不是闰年" << endl;
       }
   }
}

在这个示例中,我们有一个年份列表。我们检查每个年份是否为闰年。

QList<int> years({2010, 2011, 2012, 2013, 2014, 2015, 2016, 2020, 2024});

我们初始化了一个年份列表。

for (int year: years) {

    if (QDate::isLeapYear(year)) {

        out << year << " 是闰年" << endl;
    } else {

        out << year << " 不是闰年" << endl;
    }
}

我们遍历该列表并确定给定的年份是否为闰年。QDate::isLeapYear 返回一个布尔值,真或假。

$ ./leapyear 
2010 不是闰年
2011 不是闰年
2012 是闰年
2013 不是闰年
2014 不是闰年
2015 不是闰年
2016 是闰年
2020 是闰年
2024 是闰年

Qt5 预定义日期格式
Qt5 有一些内置的日期格式。QDate 对象的 toString 方法接受一个日期格式作为参数。Qt5 使用的默认日期格式是 Qt::TextDate。

  • predefined_date_formats.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QDate cd = QDate::currentDate();

   out << "今天是 " << cd.toString(Qt::TextDate) << endl;
   out << "今天是 " << cd.toString(Qt::ISODate) << endl;
   out << "今天是 " << cd.toString(Qt::SystemLocaleShortDate) << endl;
   out << "今天是 " << cd.toString(Qt::SystemLocaleLongDate) << endl;
   out << "今天是 " << cd.toString(Qt::DefaultLocaleShortDate) << endl;
   out << "今天是 " << cd.toString(Qt::DefaultLocaleLongDate) << endl;
   out << "今天是 " << cd.toString(Qt::SystemLocaleDate) << endl;
   out << "今天是 " << cd.toString(Qt::LocaleDate) << endl;
}

在这个示例中,我们展示了当前日期的八种不同日期格式。

out << "今天是 " << cd.toString(Qt::ISODate) << endl;

在这里,我们以 Qt::ISODate 格式打印当前日期,这是一种用于显示日期的国际标准格式。

$ ./predefined_date_formats 
今天是 2020年12月3日 星期四
今天是 2020-12-03
今天是 12/3/20
今天是 2020年12月3日 星期四
今天是 12/3/20
今天是 2020年12月3日 星期四
今天是 12/3/20
今天是 12/3/20

Qt5 自定义日期格式
日期可以用多种其他格式表示。在 Qt5 中,我们也可以创建自定义的日期格式。toString 方法的另一个版本接受一个格式字符串,在其中我们可以使用各种格式说明符。例如,d 说明符表示没有前导零的日期数字(1 到 31)。dd 说明符表示有前导零的日期数字(01 到 31)。以下表格列出了可用的日期格式表达式:

表达式 输出
d 没有前导零的日期数字(1 到 31)
dd 有前导零的日期数字(01 到 31)
ddd 本地化的缩写星期几名称(例如,'Mon' 到 'Sun')。使用 QDate::shortDayName。
dddd 本地化的完整星期几名称(例如,'Monday' 到 'Sunday')。使用 QDate::longDayName。
M 没有前导零的月份数字(1 到 12)
MM 有前导零的月份数字(01 到 12)
MMM 本地化的缩写月份名称(例如,'Jan' 到 'Dec')。使用 QDate::shortMonthName。
MMMM 本地化的完整月份名称(例如,'January' 到 'December')。使用 QDate::longMonthName。
yy 两位数的年份(00 到 99)
yyyy 四位数的年份。如果年份为负数,还会在前面加上一个负号。
表格:日期格式说明符

  • cusom_date_formats.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QDate cd = QDate::currentDate();

   out << "今天是 " << cd.toString("yyyy-MM-dd") << endl;
   out << "今天是 " << cd.toString("yy/M/dd") << endl;
   out << "今天是 " << cd.toString("d. M. yyyy") << endl;
   out << "今天是 " << cd.toString("d-MMMM-yyyy") << endl;
}

我们有四种自定义日期格式。

out << "今天是 " << cd.toString("yyyy-MM-dd") << endl;

这是国际日期格式。日期的各个部分用破折号分隔。yyyy 表示四位数的年份。MM 表示有前导零的月份数字(01 到 12)。而 dd 表示有前导零的日期数字(01 到 31)。

out << "今天是 " << cd.toString("yy/M/dd") << endl;

这是另一种常见的日期格式。各个部分用斜杠(/)分隔。M 说明符表示没有前导零的月份数字(1 到 12)。

out << "今天是 " << cd.toString("d. M. yyyy") << endl;

这种日期格式在斯洛伐克使用。各个部分用点分隔。日期和月份没有前导零。首先是日期,然后是月份,最后是年份。

$ ./custom_date_formats 
今天是 2020-12-03
今天是 20/12/03
今天是 3. 12. 2020
今天是 3-December-2020

Qt5 预定义时间格式
时间也有一些预定义的格式。标准格式说明符与日期格式中使用的相同。Qt5 使用的默认时间格式是 Qt::TextDate。

  • predefined_time_formats.cpp
#include <QTextStream>
#include <QTime>

int main(void) {

   QTextStream out(stdout);

   QTime ct = QTime::currentTime();

   out << "时间是 " << ct.toString(Qt::TextDate) << endl;
   out << "时间是 " << ct.toString(Qt::ISODate) << endl;
   out << "时间是 " << ct.toString(Qt::SystemLocaleShortDate) << endl;
   out << "时间是 " << ct.toString(Qt::SystemLocaleLongDate) << endl;
   out << "时间是 " << ct.toString(Qt::DefaultLocaleShortDate) << endl;
   out << "时间是 " << ct.toString(Qt::DefaultLocaleLongDate) << endl;
   out << "时间是 " << ct.toString(Qt::SystemLocaleDate) << endl;
   out << "时间是 " << ct.toString(Qt::LocaleDate) << endl;
}

在这个示例中,我们展示了当前时间的八种不同时间格式。

out << "时间是 " << ct.toString(Qt::ISODate) << endl;

在这里,我们以 Qt::ISODate 格式打印当前时间,这是一种用于显示时间的国际标准格式。

$ ./predefined_time_formats 
时间是 10:59:05
时间是 10:59:05
时间是 上午10:59
时间是 上午10:59:05 中欧时间
时间是 上午10:59
时间是 上午10:59:05 中欧时间
时间是 上午10:59
时间是 上午10:59

Qt5 中获取星期几
dayOfWeek 方法返回一个数字,该数字表示一周中的某一天,其中 1 代表星期一,7 代表星期日。

  • weekday.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QDate cd = QDate::currentDate();
   int wd = cd.dayOfWeek();

   QLocale locale(QLocale("en_US"));

   out << "Today is " << locale.dayName(wd) << endl;
   out << "Today is " << locale.dayName(wd, QLocale::ShortFormat) << endl;
}

在这个示例中,我们打印出当前星期几的全称和简称。

QDate cd = QDate::currentDate();

我们获取当前日期。

int wd = cd.dayOfWeek();

从当前日期中我们获取星期几

out << "Today is " << locale.dayName(wd) << endl;

我们获取星期几的全称。

out << "Today is " << locale.dayName(wd, QLocale::ShortFormat) << endl;

我们获取星期几的全称。

$ ./weekday 
Today is Thursday
Today is Thu

天数计算
我们可以使用 daysInMonth 方法计算特定月份的天数,使用 daysInYear 方法计算一年中的天数。

  • nofdays.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);
   QList<QString> months;

   months.append("January");
   months.append("February");
   months.append("March");
   months.append("April");
   months.append("May");
   months.append("June");
   months.append("July");
   months.append("August");
   months.append("September");
   months.append("October");
   months.append("November");
   months.append("December");

   QDate dt1 { 2020, 9, 18 };
   QDate dt2 { 2020, 2, 11 };
   QDate dt3 { 2020, 5, 1 };
   QDate dt4 { 2020, 12, 11 };
   QDate dt5 { 2020, 2, 29 };

   out << "There are " << dt1.daysInMonth() << " days in "
       << months.at(dt1.month()-1) << endl;
   out << "There are " << dt2.daysInMonth() << " days in "
       << months.at(dt2.month()-1) << endl;
   out << "There are " << dt3.daysInMonth() << " days in "
       << months.at(dt3.month()-1) << endl;
   out << "There are " << dt4.daysInMonth() << " days in "
       << months.at(dt4.month()-1) << endl;
   out << "There are " << dt5.daysInMonth() << " days in "
       << months.at(dt5.month()-1) << endl;

   out << "There are " << dt1.daysInYear() << " days in year "
       << QString::number(dt1.year()) << endl;
}

创建了五个日期对象。我们计算这些月份的天数以及特定年份的天数。

QDate dt1 { 2020, 9, 18 };
QDate dt2 { 2020, 2, 11 };
QDate dt3 { 2020, 5, 1 };
QDate dt4 { 2020, 12, 11 };
QDate dt5 { 2020, 2, 29 };

创建了五个 QDate 对象。每个对象代表不同的日期。

out << "There are " << dt1.daysInMonth() << " days in "
    << months.at(dt1.month()-1) << endl;

我们使用 daysInMonth 方法获取日期对象中月份的天数。

out << "There are " << dt1.daysInYear() << " days in year "
    << QString::number(dt1.year()) << endl;

在这里,我们使用日期对象的 daysInYear 方法获取一年中的天数。

$ ./nofdays 
There are 30 days in September
There are 29 days in February
There are 31 days in May
There are 31 days in December
There are 29 days in February
There are 366 days in year 2020

Qt5 检查日期有效性
有一个 isValid 方法用于检查一个日期是否有效。

  • validity.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

    QTextStream out(stdout);

    QList<QDate> dates { 
        QDate(2020, 5, 11), QDate(2020, 8, 1),
        QDate(2020, 2, 30)
    };

    for (int i=0; i < dates.size(); i++) {

       if (dates.at(i).isValid()) {

           out << "Date " << i+1 << " is a valid date" << endl;
       } else {
           
           out << "Date " << i+1 << " is not a valid date" << endl;
       }
    }
}

在这个示例中,我们检查了三个日期的有效性。

QList<QDate> dates { 
    QDate(2020, 5, 11), QDate(2020, 8, 1),
    QDate(2020, 2, 30)
};

前两个日期是有效的,第三个日期是无效的。二月有 28 天或 29 天。

if (dates.at(i).isValid()) {

    out << "Date " << i+1 << " is a valid date" << endl;
} else {
    
    out << "Date " << i+1 << " is not a valid date" << endl;
}

根据 isValid 方法的结果,我们向控制台打印一条关于日期有效性的消息。

$ ./validity
Date 1 is a valid date
Date 2 is a valid date
Date 3 is not a valid date

Qt5 的 addDays 和 daysTo 方法
我们可以很容易地计算出从特定日期开始 n 天后的日期。我们使用 addDays 方法。daysTo 方法返回距离所选日期的天数。

  • daystofrom.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

    QTextStream out(stdout);

    QDate dt { 2020, 5, 11 };
    QDate nd = dt.addDays(55);

    QDate cd = QDate::currentDate();
    int year = cd.year();
    QDate xmas { year, 12, 24 };

    out << "55 days from " << dt.toString() << " is "
        << nd.toString() << endl;
    out << "There are " << QDate::currentDate().daysTo(xmas)
        << " days till Christmas" << endl;
}

我们得到了从 2020 年 5 月 11 日起 55 天后的日期。我们还得到了距离圣诞节的天数。

QDate dt { 2020, 5, 11 };
QDate nd = dt.addDays(55);

addDays 方法返回一个 QDate 对象,该对象是给定日期之后 55 天的日期。

QDate xmas { year, 12, 24 };
...
out << "There are " << QDate::currentDate().daysTo(xmas)
    << " days till Christmas" << endl;

使用 daysTo 方法计算距离圣诞节的天数。

$ ./daystofrom 
55 days from Mon May 11 2020 is Sun Jul 5 2020
There are 21 days till Christmas

Qt5 的 QDateTime 类
QDateTime 对象包含一个日历日期和一个时钟时间。它是 QDate 类和 QTime 类的组合。它有许多类似的方法,并且使用方式与这两个类相同。

  • datetime.cpp
#include <QTextStream>
#include <QDateTime>

int main(void) {

   QTextStream out(stdout);
   QDateTime cdt = QDateTime::currentDateTime();

   out << "The current datetime is " << cdt.toString() << endl;
   out << "The current date is " << cdt.date().toString() << endl;
   out << "The current time is " << cdt.time().toString() << endl;
}

这个示例获取当前的日期和时间。

out << "The current datetime is " << cdt.toString() << endl;

这行代码将当前的日期和时间打印到终端。

out << "The current date is " << cdt.date().toString() << endl;

这行代码使用 date 方法获取日期时间对象中的日期部分。

$ ./datetime 
The current datetime is Thu Dec 3 12:29:42 2020
The current date is Thu Dec 3 2020
The current time is 12:29:42

Unix 时间戳
纪元是被选作特定时代起点的一个时间点。例如,在西方基督教国家,时间纪元从耶稣诞生的第 0 天开始。另一个例子是法国共和历,它使用了 12 年。其纪元是共和时代的开始,即 1792 年 9 月 22 日,这一天法兰西第一共和国宣告成立,君主制被废除。

计算机也有它们自己的纪元。其中最流行的一个是 Unix 时间戳。Unix 时间戳是 1970 年 1 月 1 日 00:00:00 UTC(或 1970-01-01T00:00:00Z ISO 8601 标准格式)。计算机中的日期和时间是根据自该计算机或平台定义的纪元以来经过的秒数或时钟滴答数来确定的。

Unix 时间是自 Unix 时间戳以来经过的秒数。

$ date +%s
1606995554

Unix 的 date 命令可用于获取 Unix 时间。在这个特定时刻,自 Unix 时间戳以来已经过去了 1606995554 秒。

  • unix_epoch.cpp
#include <QTextStream>
#include <QDateTime>
#include <ctime>

int main(void) {

  QTextStream out(stdout);

  time_t t = time(0);
  out << t << endl;

  QDateTime dt;
  dt.setTime_t(t);
  out << dt.toString() << endl;

  QDateTime cd = QDateTime::currentDateTime();
  out << cd.toTime_t() << endl;
}

在这个示例中,我们使用两个 Qt5 函数来获取 Unix 时间,并将其转换为人类可读的形式。

#include <ctime>

我们包含标准的 C++ 时间头文件。

time_t t = time(0);
out << t << endl;

使用标准的 C++ time 函数,我们获取 Unix 时间。

QDateTime dt;
dt.setTime_t(t);
out << dt.toString() << endl;

setTime_t 函数用于将 Unix 时间转换为日期时间对象,并格式化为人类可读的形式。

QDateTime cd = QDateTime::currentDateTime();
out << cd.toTime_t() << endl;

Qt5 的 toTime_t 函数也可用于获取 Unix 时间。

$ ./unixepoch 
1606995613
Thu Dec 3 12:40:13 2020
1606995613

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: