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

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

ztj100 2025-05-02 22:42 14 浏览 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

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: