Qt学习(10)——Qt5中的日期(Date)和时间(Time)(4)

时间:2021-11-03 23:12:38

QDateTime类

QDateTime对象包含日历日期和时钟时间。它是QDateQTime类的组合。它有许多类似的方法,用法与这两个类相同。

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

int main(void) {

   QTextStream out(stdout);
   // 获取当前时间
   QDateTime cdt = QDateTime::currentDateTime();   

   out << "The current datetime is " << cdt.toString() << endl;
   // 通过date()方法获取日期
   out << "The current date is " << cdt.date().toString() << endl;
   // 通过time()方法获取时间
   out << "The current time is " << cdt.time().toString() << endl;   
}

输出结果为:

$ ./datetime 
The current datetime is 周二 220 11:05:19 2018
The current date is 周二 220 2018
The current time is 11:05:19

朱利安日

朱利安日是指自朱利安时期开始以来连续数天。它主要由天文学家使用。它不应该与朱利安日历混淆。朱利安时期始于公元前4713年。朱利安日号码0被分配到从公元前4713年1月1日中午开始的那天。朱利安日数(JDN)是自本阶段开始以来经过的天数。任何时刻的朱利安日(JD)都是前一个中午的朱连日数加上该时刻以来的那一天的一小部分。(Qt5不计算这个分数。)除了天文学,朱利安日期通常被军事和大型机程序使用。

// julianday.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   QDate cd = QDate::currentDate();

   out << "Gregorian date for today: " << cd.toString(Qt::ISODate) << endl;
   // toJulianDay返回julian日
   out << "Julian day for today: " << cd.toJulianDay() << endl;                
}

输出结果为:

$ ./julian 
Gregorian date for today: 2018-02-20
Julian day for today: 2458170

使用朱利安日期,很容易做计算。

// battles.cpp
#include <QTextStream>
#include <QDate>

int main(void) {

   QTextStream out(stdout);

   // 有两次拿破仑时代的战斗日期。
   QDate bordate(1812, 9, 7);
   QDate slavdate(1805, 12, 2);

   QDate cd = QDate::currentDate();

   // 计算今天和斯拉夫科夫和波多迪诺的战斗的朱利安天。
   int j_today = cd.toJulianDay();
   int j_borodino = bordate.toJulianDay();
   int j_slavkov = slavdate.toJulianDay();

   // 计算自两场战斗以来经过的天数。
   out << "Days since Slavkov battle: " << j_today - j_slavkov << endl;
   out << "Days since Borodino battle: " << j_today - j_borodino << endl;
}

输出结果为:

$ date
20180220日 星期二 11:18:53 CST
$ ./battles 
Days since Slavkov battle: 77512
Days since Borodino battle: 75041

UTC时间

有关UTC时间的详细信息,请见:https://en.wikipedia.org/wiki/Coordinated_Universal_Time

// utclocal.cpp
#include <QTextStream>
#include <QDateTime>

int main(void) {

  QTextStream out(stdout);

  QDateTime cdt = QDateTime::currentDateTime();   
  // toUTC()获取UTC时间
  out << "Universal datetime: " << cdt.toUTC().toString() << endl;
  // toLocalTime()获取本地时间
  out << "Local datetime: " << cdt.toLocalTime().toString() << endl;
}

输出结果:

$ ./utclocal 
Universal datetime: 周二 220 03:30:09 2018 GMT
Local datetime: 周二 220 11:30:09 2018

UNIX时代

电脑也有他们的时代。最流行的是unix时代。unix时代是1970年1月1日00:00:00 utc(或1970-01-01t00:00:00z iso 8601)的时间。计算机中的日期和时间根据自该计算机或平台的定义历元起经过的秒数或时钟滴答数来确定。
unix time是unix时代以来所经过的秒数。

$ date +%s
1519098568

可以使用unix date命令来获取unix时间。在这个特定的时刻,自unix时代以来已经过去了1519098568秒。

// unixepoch.cpp
#include <QTextStream>
#include <QDateTime>
#include <ctime> // C++标准time头文件

int main(void) {

  QTextStream out(stdout);

  // 使用C++标准time()方法获取UNIX时间
  time_t t = time(0);  
  out << t << endl;

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

  // Qt5的toTime_t()方法也可用于获取unix时间。
  QDateTime cd = QDateTime::currentDateTime();
  out << cd.toTime_t() << endl;       
}
  QDateTime dt;
  dt.setTime_t(t);
  out << dt.toString() << endl;

setTime_t()方法用于将unix时间转换为人类可读形式的日期时间。
输出结果为:

$ ./unixepoch 
1519099151
周二 220 11:59:11 2018
1519099151