Qt には日付と時刻を担当する3つのクラスがあります。
日付と時刻のオブジェクトには、2つの作り方があります。
この章では、datetime ディクトリに datetime.cpp を作成して、作業を進めていきます。
#include <QTextStream>
#include <QDate>
#include <QTime>
int main (void)
{
QTextStream out (stdout);
QDate d1 {2025, 4, 1};
out << "The date is " << d1.toString() << Qt::endl;
QDate d2;
d2.setDate (2025, 5, 5);
out << "The date is " << d2.toString() << Qt::endl;
QTime t1 {18, 30, 33, 12};
out << "The time is " << t1.toString("hh:mm:ss.zzz") << Qt::endl;
QTime t2;
t2.setHMS (18, 45, 55, 222);
out << "The time is " << t2.toString("hh:mm:ss.zzz") << Qt::endl;
return 0;
}
datetime ディレクトリで作業を続けます。
// プロジェクトを作ります。
qmake -project
// Windows の場合は出来上がった datetime.pro の末尾に次の一行を追加します。
CONFIG += console
// Makefile を作ります。
qmake
// 実行ファイルを作ります。
// Mac Linux の場合は make します。
make
// Windows の場合は nmake します。make じゃなく nmake です。
nmake
// エラーが表示されたら、datetime.cpp を見直して、make あるいは nmake する作業を繰り返します。
// Mac の場合は datetime ディレクトリに datetime.app ができあがります。
// GUI アプリケーションならこれをダブルクリックすると起動できますが、
// 今回はコマンドラインアプリなので次のようにして実行します
./datetime.app/Contents/MacOS/datetime
// 結果
The date is Tue Apr 1 2025
The date is Mon May 5 2025
The time is 18:30:33.012
The time is 18:45:55.222
// Linux の場合には datetime ディレクトリに datetime という実行ファイルが出来上がっていますのでそれをそのまま実行します
./datetime
// 結果 は同じ
// Windows の場合には datetime ディクトリの中の release ティれクトリに datetime.exe が出来上がっています。
// release ディレクトリに移動して、datetime.exe を実行します。
datetime
// 結果 は同じ
余談ですが、time.cpp というファイル名は使えないらしいです。
#include <QTextStream>
#include <QDate>
#include <QTime>
int main (void)
{
QTextStream out (stdout);
QDate d = QDate::currentDate ();
QTime t = QTime::currentTime ();
out << "Current date is " << d.toString() << Qt::endl;
out << "Current time is " << t.toString() << Qt::endl;
return 0;
}
Current date is Tue Apr 1 2025
Current time is 18:54:48
比較演算子は日付の比較にも使えます。
#include <QTextStream>
#include <QDate>
int main (void)
{
QTextStream out (stdout);
QDate d1 {2025, 4, 1};
QDate d2 {2024, 4, 1};
if (d1 < d2)
out << d1.toString() << " は " << d2.toString() << " より前です。" << Qt::endl;
else
out << d1.toString() << " は " << d2.toString() << " より後です。" << Qt::endl;
return 0;
}
Tue Apr 1 2025 は Mon Apr 1 2024 より後です。
比較演算子は QTime、QDateTime にも使えます。
QDate::isLeapYear() メソッドはうるう年であれば true を返します。
#include <QTextStream>
#include <QDate>
int main (void)
{
QTextStream out (stdout);
out << "1990年から2025年の間で、うるう年は、" << Qt::endl;
for (int i = 1990; i <= 2025; i++)
{
if (QDate::isLeapYear (i))
out << i << "年。";
}
out << Qt::endl << "です。" << Qt::endl;
return 0;
}
1990年から2025年の間で、うるう年は、
1992年。1996年。2000年。2004年。2008年。2012年。2016年。2020年。2024年。
です。
そういえば、去年、オリンピックでしたね。
QDate には事前に定義されている日付の形式が2つあります。
#include <QTextStream>
#include <QDate>
int main(void) {
QTextStream out (stdout);
QDate cd = QDate::currentDate();
out << "Today is "<< cd.toString(Qt::TextDate) << Qt::endl;
out << "Today is "<< cd.toString(Qt::ISODate) << Qt::endl;
return 0;
}
Today is Tue Apr 1 2025
Today is 2025-04-01
日付の形式はカスタムすることができます。
指定子 | 出力結果 |
---|---|
d | 先頭に0のない1から31で表される日付 |
dd | 先頭に0のある01から31で表される日付 |
ddd | 簡略化されローカライズされた曜日名。(例: Mon、Sun) QDate::shortDayNameを使う |
dddd | 簡略化されずローカライズされた曜日名。(例: Monday、Sunday) QDate::longDayNameを使う |
M | 先頭に0のない1から12で表される月。 |
MM | 先頭に0のある01から12で表される月。 |
MMM | 簡略化されローカライズされた月名。(例: Jan、Dec) QDate::shortMonthNameを使う |
MMMM | 簡略化されずローカライズされた月名。(例: January、December) QDate::longMonthNameを使う |
yy | 2桁の数字で表された年。(例: 00、99) |
yyyy | 4桁で表された年。年が負の場合、先頭に - が付く。 |
#include <QTextStream>
#include <QDate>
int main(void)
{
QTextStream out (stdout);
QDate d = QDate::currentDate ();
out << "Today is " << d.toString ("yyyy-MM-dd") << Qt::endl;
out << "Today is " << d.toString ("yy/M/dd") << Qt::endl;
out << "Today is " << d.toString ("d. M. yyyy") << Qt::endl;
out << "Today is " << d.toString ("d-MMMM-yyyy") << Qt::endl;
return 0;
}
Today is 2025-04-01
Today is 25/4/01
Today is 1. 4. 2025
Today is 1-April-2025
時刻の形式も事前に定義されたものが2つあります。Qt のデフォルトの時刻形式は Qt::TextDate です。
#include <QTextStream>
#include <QTime>
int main(void)
{
QTextStream out (stdout);
QTime t = QTime::currentTime ();
out << "The Time is " << t.toString (Qt::TextDate) << Qt::endl;
out << "The Time is " << t.toString (Qt::ISODate) << Qt::endl;
return 0;
}
The Time is 21:40:11
The Time is 21:40:11
結果は同じですね。
時刻の形式もカスタムすることができます。
指定子 | 出力結果 |
---|---|
h | 先頭に0のない時間。0から23か1から12(AM/PMの場合) |
hh | 先頭に0のある時間。00から23か01から12(AM/PMの場合) |
H | >先頭に0のない時間。0から23(AM/PMの場合も同じ) |
HH | 先頭に0のある時間。00から23(AM/PMの場合も同じ |
m | 先頭に0のない分。0から59 |
mm | 先頭に0のある分。00から59 |
s | 先頭に0のない秒。0から59 |
ss | 先頭に0のある秒。00から59 |
z | 先頭に0のないミリ秒。0から999 |
zzz | 先頭に0のあるミリ秒。000から999 |
AP or A | AM PM を表示する |
ap or a | am pm を表示する |
t | タイムゾーンを表示する |
#include <QTextStream>
#include <QTime>
int main(void)
{
QTextStream out (stdout);
QTime t = QTime::currentTime ();
out << "The Time is " << t.toString ("hh::mm:ss.zzz") << Qt::endl;
out << "The Time is " << t.toString ("h:m:s a") << Qt::endl;
out << "The Time is " << t.toString ("h:m:s A") << Qt::endl;
out << "The Time is " << t.toString ("h:m:s AP") << Qt::endl;
out << "The Time is " << t.toString ("h:m:s t") << Qt::endl;
return 0;
}
The Time is 10:51:32 pm
The Time is 10:51:32 PM
The Time is 10:51:32 PM
The Time is 22:51:32 JST
dayOfWeek() メソッドは、月曜日を1、日曜日を7とする数字を返してくれます。
#include <QTextStream>
#include <QDate>
int main(void)
{
QTextStream out (stdout);
QDate d = QDate::currentDate ();
int w = d.dayOfWeek();
QLocale locale (QLocale("ja_JP"));
out << "今日は" << locale.dayName(w) << "です。" << Qt::endl;
out << "今日は" << locale.dayName(w, QLocale::ShortFormat) << "です。" << Qt::endl;
return 0;
}
今日は火曜日です。
今日は火です。
daysInMonth()メソッドで月の日数を、daysInYear()メソッドで年の日数を取得できます。
#include <QTextStream>
#include <QDate>
int main(void)
{
QTextStream out (stdout);
QList<QString> months;
months.append("睦月");
months.append("如月");
months.append("弥生");
months.append("卯月");
months.append("皐月");
months.append("皆月");
months.append("文月");
months.append("葉月");
months.append("長月");
months.append("神無月");
months.append("霜月");
months.append("師走");
QDate d1 {2025, 4, 1};
QDate d2 {2025, 5, 5};
QDate d3 {2025, 7, 21};
QDate d4 {2025, 8, 11};
QDate d5 {2025, 9, 23};
out << months.at(d1.month()-1) << "は" << d1.daysInMonth() << "日です。" << Qt::endl;
out << months.at(d2.month()-1) << "は" << d2.daysInMonth() << "日です。" << Qt::endl;
out << months.at(d3.month()-1) << "は" << d3.daysInMonth() << "日です。" << Qt::endl;
out << months.at(d4.month()-1) << "は" << d4.daysInMonth() << "日です。" << Qt::endl;
out << months.at(d5.month()-1) << "は" << d5.daysInMonth() << "日です。" << Qt::endl;
out << QString::number(d1.year()) << "年は" << d1.daysInYear() << "日です。" << Qt::endl;
return 0;
}
QList<QString> months; については、次章コレクションで説明します。
卯月は30日です。
皐月は31日です。
文月は31日です。
葉月は31日です。
長月は30日です。
2025年は365日です。
#include <QTextStream>
#include <QDate>
int main(void)
{
QTextStream out (stdout);
QList<QDate> dates
{
QDate(2025, 4, 1),
QDate(2025, 11, 30),
QDate(2026, 2, 30),
};
for (int i=0; i < dates.size(); i++)
{
if (dates.at(i).isValid())
out << "日付" << i+1 << "は有効な日付です。" << Qt::endl;
else
out << "日付" << i+1 << "は無効な日付です。" << Qt::endl;
}
return 0;
}
日付1は有効な日付です。
日付2は有効な日付です。
日付3は無効な日付です
2月は28日か29日なので2026年2月30日は無効な日付です。
addDays メソッドで n 日後の日付を、dayTo メソッドである日付までの日数が得られます。
#include <QTextStream>
#include <QDate>
int main(void)
{
QTextStream out (stdout);
QDate d1 {2025, 4, 2};
QDate d2 = d1.addDays(100);
QDate d3 = QDate::currentDate ();
int year = d3.year();
QDate d4 = {year, 12, 31};
out << "100 days from "<< d1.toString() << " is " << d2.toString() << Qt::endl;
out << "There are " << QDate::currentDate().daysTo(d4) << " days till Oomisoka." << Qt::endl;
return 0;
}
100 days from Wed Apr 2 2025 is Fri Jul 11 2025
There are 273 days till Oomisoka.
QDateTime クラスにはカレンダーの日付と時計の時刻が含まれています。
QDate と QTime の組み合わせで、類似のメソッドがあります。
#include <QTextStream>
#include <QDateTime>
int main(void)
{
QTextStream out (stdout);
QDateTime dt = QDateTime::currentDateTime ();
out << "The current datetime is " << dt.toString () << Qt::endl;
out << "The current date is " << dt.date().toString () << Qt::endl;
out << "The current time is " << dt.time().toString () << Qt::endl;
return 0;
}
The current datetime is Wed Apr 2 00:48:15 2025
The current date is Wed Apr 2 2025
The current time is 00:48:15
ユリウス歴は、紀元前45年1月1日に、ユリウス・カエサルが導入した太陽暦です。
コンピュータプログラムでは、このユリウス歴の始まった日からの経過日数を参照することがあります。
このユリウス歴での経過日数のことを「ユリウスの日」と言います。
#include <QTextStream>
#include <QDateTime>
int main(void)
{
QTextStream out (stdout);
QDate d = QDate::currentDate ();
out << "今日のグレゴリオ歴の日付: " << d.toString(Qt::ISODate) << Qt::endl;
out << "今日のユリウスの日: " << d.toJulianDay() << "日" << Qt::endl;
return 0;
}
今日のグレゴリオ歴の日付: 2025-04-02
今日のユリウスの日: 2460768日
Universal time coordinated -UTC は、協定世界時です。
#include <QTextStream>
#include <QDateTime>
int main(void)
{
QTextStream out (stdout);
QDateTime dt = QDateTime::currentDateTime ();
out << "世界協定時刻: " << dt.toUTC().toString() << Qt::endl;
out << "ローカル時刻: " << dt.toLocalTime().toString() << " " << dt.toLocalTime().toString("t") << Qt::endl;
return 0;
}
世界協定時刻: Tue Apr 1 17:14:46 2025 GMT
ローカル時刻: Wed Apr 2 02:14:46 2025 JST
Unix の時代 (The Unix epoch) は、コンピュータプログラミングで人気のある時刻です。
The Unix epoch は 1970 年 1 月 1 日 0 時 0 分 0 秒から始まります。
ターミナルで次のようにコマンドすると Unix の日からの経過時間が秒で表示されます。
date +%s
1743528211