Qt   言語   日付と時刻

ホーム   C/C++チュートリアル  
目次

日付と時刻

Qt には日付と時刻を担当する3つのクラスがあります。

  1. QDate
    グレゴリオ歴のカレンダーを扱うクラスです。日付の決定、比較、操作ができます。
  2. QTime
    クロックタイムを扱うクラスです。時刻の決定、比較、操作ができます。
  3. QDateTime
    QDate と QTime を一つに結合させたクラスです。

日付と時刻の作り方

日付と時刻のオブジェクトには、2つの作り方があります。

  1. クラスのコンストラクタでオブジェクトを作成する。
  2. 空のオブジェクトを作成して、後からデータを埋める。

この章では、datetime ディクトリに datetime.cpp を作成して、作業を進めていきます。

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 というファイル名は使えないらしいです。

datetime.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

日付の比較

比較演算子は日付の比較にも使えます。

datetime.cpp

#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 を返します。

datetime.cpp


#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つあります。

datetime.cpp


#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桁で表された年。年が負の場合、先頭に - が付く。

datetime.cpp


#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 です。

datetime.cpp


#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 タイムゾーンを表示する

datetime.cpp


#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とする数字を返してくれます。

datetime.cpp


#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()メソッドで年の日数を取得できます。

datetime.cpp


#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日です。

有効な日付かどうかを検査する

datetime.cpp


#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日は無効な日付です。

n 日後の日付と、ある日付までの日数

addDays メソッドで n 日後の日付を、dayTo メソッドである日付までの日数が得られます。

datetime.cpp


#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 クラス

QDateTime クラスにはカレンダーの日付と時計の時刻が含まれています。

QDate と QTime の組み合わせで、類似のメソッドがあります。

datetime.cpp


#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日に、ユリウス・カエサルが導入した太陽暦です。

コンピュータプログラムでは、このユリウス歴の始まった日からの経過日数を参照することがあります。

このユリウス歴での経過日数のことを「ユリウスの日」と言います。

datetime.cpp


#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日

UTC   協定世界時

Universal time coordinated -UTC は、協定世界時です。

datetime.cpp


#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 の時代

Unix の時代 (The Unix epoch) は、コンピュータプログラミングで人気のある時刻です。

The Unix epoch は 1970 年 1 月 1 日 0 時 0 分 0 秒から始まります。

ターミナルで次のようにコマンドすると Unix の日からの経過時間が秒で表示されます。


date +%s
1743528211


30 visits
Posted: Apr. 01, 2025
Update: Apr. 02, 2025

ホーム   C/C++チュートリアル   目次