Qtの基礎 - 日時
概要
Qtにおいて、QDate
クラスまたはQTime
クラスを使用して、日付および時刻の有効性を確認する。
エポックタイムの取得
エポックタイム (UNIXタイムやPOSIXタイムとも呼ばれる) を取得する場合、QDateTime
クラスを使用する。
エポックタイムは、1970年1月1日00:00:00 UTCからの経過秒数を示しており、多くのプログラミング環境で日付と時刻を扱う際の基準である。
#include <QDateTime>
// 現在の日時を取得
QDateTime now = QDateTime::currentDateTime();
// エポックタイム (UNIXタイム) を秒単位で取得
// toSecsSinceEpochメソッドは、Qt 5.8以降で使用可能
// Qt 5.8以前を使用している場合は、toTime_tメソッドを使用することもできるが、2038年問題に対応していないため注意する必要がある
qint64 epochTime = now.toSecsSinceEpoch();
ISO 8601
ISO 8601では、日付と時刻は"YYYY-MM-DDTHH:MM:SS"で表現される。
例えば、2024年3月15日 0時14分44秒の場合は、"2024-03-15T00:14:44"のように表す。 ("T"は、日付と時刻の区切りを示す)
ISO 8601は国際標準化機構(ISO)により定められた日付と時刻の表記に関する国際規格であり、主にデータ交換の文脈で利用される。
以下の例では、"2024-03-01T16:24:32Z"というUTCの日時 (文字列) を日本時間に変換して、"yyyy年M月d日 H時m分"という形式に変換している。
#include <QDateTime>
#include <QTimeZone>
// UTCの日時を表す文字列
QString utcDateTimeStr = "2024-03-01T16:24:32Z";
// UTCの日時をQDateTimeに変換
// Qt::ISODateにZを含むことでUTCとして解釈される
QDateTime utcDateTime = QDateTime::fromString(utcDateTimeStr, Qt::ISODate);
// UTC時間を明示的に設定
utcDateTime.setTimeSpec(Qt::UTC);
// 日本のタイムゾーンオブジェクト
QTimeZone jpTimeZone("Asia/Tokyo");
// UTCから日本時間へ変換
QDateTime jpDateTime = utcDateTime.toTimeZone(jpTimeZone);
// 日本時間に変換された日時を指定のフォーマットで出力
QString formattedDateTime = jpDateTime.toString("yyyy年M月d日 H時m分");
std::cout << formattedDateTime.toStdString() << std::endl;
}
その他の時刻形式
yyyy/MM/dd HH:mm:ss形式
この形式は特定の国や地域でよく使用されるが、厳密に定義された国際規格が存在するわけではない。
しかし、他のソフトウェアやデータベースシステムで日付と時刻を表現するために使用されることがある。
以下の例では、yyyy/MM/dd HH:mm:ss形式からHH:mm:ssの部分 (時刻) のみを取得している。
#include <QDateTime>
#include <QTime>
QString originalDateTimeString = "2024/03/15 00:14:44";
QDateTime dateTime = QDateTime::fromString(originalDateTimeString, "yyyy/MM/dd HH:mm:ss");
if (dateTime.isValid()) {
QString timeString = dateTime.time().toString("HH:mm:ss");
std::cout << QString("Converted Time : %1").arg(timeString).toStdString() << std::endl;
}
else {
std::cout << QString("Error: Invalid date/time format.").toStdString() << std::endl;
}
日付および時刻の有効性の確認
以下の例では、閏年の判定等も含めて、入力された日付および時刻の有効性を確認している。
- 日付
QDate
クラスのコンストラクタに年月日を代入して、isValid
メソッドで判定する。
- 時刻
QTime
クラスのコンストラクタに時分秒を代入して、isValid
メソッドで判定する。
// 日付
#include <QDate>
qDebug() << QDate(2019, 2, 28).isValid(); // true
qDebug() << QDate(2019, 2, 29).isValid(); // false(閏年ではないため)
qDebug() << QDate(2020, 2, 28).isValid(); // true
qDebug() << QDate(2020, 2, 29).isValid(); // true(閏年のため)
// 時刻
#include <QTime>
qDebug() << QTime(23, 59, 59).isValid(); // true
qDebug() << QTime(0, 0, 0).isValid(); // true
qDebug() << QTime(25, 0, 0).isValid(); // false
qDebug() << QTime(0, 60, 0).isValid(); // false
qDebug() << QTime(0, 0, 60).isValid(); // false
また、QDateTime
クラスというQDate
クラスとQTime
クラスの両方を取得するクラスもあるが、
"日付が正常かつ時刻が異常の場合、時刻を00:00:00にする仕様"のため、(その結果、QDateTime::isValid
メソッドはtrueを返す)
時刻の有効性が確認できない。