Qt中日期/时间/时区类 (QDate, QTime, QDateTime,QTimeZone)
QDate - 日期类
专门处理日历日期(年、月、日),不包含时间信息。
基本使用
cpp
#include <QDate>// 创建日期
QDate date1(2024, 1, 15); // 2024年1月15日
QDate date2 = QDate::currentDate(); // 当前日期
QDate date3 = QDate::fromString("2024-12-25", "yyyy-MM-dd"); // 从字符串解析// 获取日期信息
int year = date1.year(); // 2024
int month = date1.month(); // 1
int day = date1.day(); // 15
int dayOfWeek = date1.dayOfWeek(); // 1 (星期一)// 日期计算
QDate tomorrow = date1.addDays(1); // 加1天
QDate nextMonth = date1.addMonths(1); // 加1个月
QDate nextYear = date1.addYears(1); // 加1年// 日期比较
if (date1 < date2) {qDebug() << "date1 在 date2 之前";
}// 有效性检查
if (date1.isValid()) {qDebug() << "日期有效";
}常用静态方法
cpp
// 获取月份天数 int daysInFeb2024 = QDate::daysInMonth(2, 2024); // 29 (闰年)// 检查闰年 bool isLeap = QDate::isLeapYear(2024); // true// 获取当前日期 QDate today = QDate::currentDate();
QTime - 时间类
专门处理时间(时、分、秒、毫秒),不包含日期信息。
基本使用
cpp
#include <QTime>// 创建时间
QTime time1(14, 30, 45); // 14:30:45
QTime time2 = QTime::currentTime(); // 当前时间
QTime time3 = QTime::fromString("09:15:00", "hh:mm:ss"); // 从字符串解析// 获取时间信息
int hour = time1.hour(); // 14
int minute = time1.minute(); // 30
int second = time1.second(); // 45
int msec = time1.msec(); // 0// 时间计算
QTime later = time1.addSecs(3600); // 加3600秒 (1小时)
QTime earlier = time1.addMSecs(-5000); // 减5000毫秒// 时间比较
if (time1 < time2) {qDebug() << "time1 在 time2 之前";
}// 格式化输出
qDebug() << time1.toString("hh:mm:ss"); // "14:30:45"
qDebug() << time1.toString("h:m ap"); // "2:30 pm"计时功能
cpp
// 开始计时 QTime timer; timer.start();// ... 执行一些操作 ...// 获取经过的时间(毫秒) int elapsed = timer.elapsed(); qDebug() << "操作耗时:" << elapsed << "毫秒";// 重新启动计时器 int restartedElapsed = timer.restart();
QDateTime - 日期时间类
组合了日期和时间,可以处理时区信息。
基本使用
cpp
#include <QDateTime>// 创建日期时间
QDateTime dt1(QDate(2024, 1, 15), QTime(14, 30, 0));
QDateTime dt2 = QDateTime::currentDateTime(); // 当前日期时间
QDateTime dt3 = QDateTime::fromString("2024-01-15 14:30:00", "yyyy-MM-dd hh:mm:ss");// 获取日期和时间部分
QDate datePart = dt1.date(); // 日期部分
QTime timePart = dt1.time(); // 时间部分// 时区处理
QDateTime utcDt = dt1.toUTC(); // 转换为UTC时间
QDateTime localDt = utcDt.toLocalTime(); // 转换回本地时间// 时间计算
QDateTime later = dt1.addDays(7); // 加7天
QDateTime earlier = dt1.addSecs(-3600); // 减1小时// 时间戳转换
qint64 timestamp = dt1.toMSecsSinceEpoch(); // 获取时间戳(毫秒)
QDateTime fromTimestamp = QDateTime::fromMSecsSinceEpoch(timestamp);常用静态方法
cpp
// 获取当前日期时间 QDateTime now = QDateTime::currentDateTime(); QDateTime utcNow = QDateTime::currentDateTimeUtc();// 从时间戳创建 QDateTime fromUnix = QDateTime::fromSecsSinceEpoch(1705294200);// 获取有效的日期时间范围 QDateTime minDt = QDateTime::fromMSecsSinceEpoch(LLONG_MIN); QDateTime maxDt = QDateTime::fromMSecsSinceEpoch(LLONG_MAX);
格式化字符串
常用格式符
| 格式符 | 含义 | 示例 |
|---|---|---|
yyyy | 4位数年份 | 2024 |
MM | 2位数月份 | 01, 12 |
dd | 2位数日期 | 05, 25 |
hh | 2位数小时(00-23) | 14, 08 |
mm | 2位数分钟 | 05, 45 |
ss | 2位数秒钟 | 09, 59 |
zzz | 3位数毫秒 | 123 |
ap | AM/PM 标识 | am, pm |
格式化示例
cpp
QDateTime dt = QDateTime::currentDateTime();qDebug() << dt.toString("yyyy-MM-dd hh:mm:ss"); // "2024-01-15 14:30:45"
qDebug() << dt.toString("dd/MM/yyyy"); // "15/01/2024"
qDebug() << dt.toString("ddd MMMM d yy"); // "周一 一月 15 24"
qDebug() << dt.toString("h:m ap"); // "2:30 下午"// 本地化格式
qDebug() << dt.toString(Qt::TextDate); // "周一 1月 15 14:30:45 2024"
qDebug() << dt.toString(Qt::ISODate); // "2024-01-15T14:30:45"
qDebug() << dt.toString(Qt::SystemLocaleShortDate); // 系统短格式
qDebug() << dt.toString(Qt::SystemLocaleLongDate); // 系统长格式QTimeZone - 时区类
QTimeZone 类用于处理时区信息,可以与 QDateTime 结合使用。
基本使用
cpp
#include <QTimeZone>
#include <QDateTime>// 创建时区对象
QTimeZone utcTimeZone("UTC"); // UTC 时区
QTimeZone beijingTimeZone("Asia/Shanghai"); // 北京时区
QTimeZone newYorkTimeZone("America/New_York"); // 纽约时区
QTimeZone systemTimeZone = QTimeZone::systemTimeZone(); // 系统时区// 获取时区信息
qDebug() << "系统时区:" << systemTimeZone.id();
qDebug() << "显示名称:" << systemTimeZone.displayName(QTimeZone::StandardTime);
qDebug() << "UTC偏移:" << systemTimeZone.standardTimeOffset() / 3600 << "小时";常用时区 ID
cpp
// 常用时区标识符
QTimeZone::utc(); // UTC 时区
QTimeZone("Asia/Shanghai"); // 中国标准时间 (CST)
QTimeZone("America/New_York"); // 美国东部时间
QTimeZone("Europe/London"); // 伦敦时间
QTimeZone("Asia/Tokyo"); // 日本时间QDateTime 与时区结合
创建带时区的日期时间
cpp
// 创建当前时间的带时区对象
QDateTime utcDateTime = QDateTime::currentDateTimeUtc();
QDateTime localDateTime = QDateTime::currentDateTime();// 创建特定时区的日期时间
QDateTime dt1 = QDateTime(QDate(2024, 1, 15), QTime(14, 30, 0), beijingTimeZone);
QDateTime dt2 = QDateTime(QDate(2024, 1, 15), QTime(14, 30, 0), newYorkTimeZone);qDebug() << "北京时间:" << dt1.toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "纽约时间:" << dt2.toString("yyyy-MM-dd hh:mm:ss");时区转换
cpp
// 创建北京时间
QDateTime beijingTime(QDate(2024, 1, 15), QTime(14, 30, 0), QTimeZone("Asia/Shanghai"));// 转换为其他时区
QDateTime utcTime = beijingTime.toTimeZone(QTimeZone::utc());
QDateTime newYorkTime = beijingTime.toTimeZone(QTimeZone("America/New_York"));
QDateTime localTime = beijingTime.toLocalTime();qDebug() << "原始时间(北京):" << beijingTime.toString("yyyy-MM-dd hh:mm:ss t");
qDebug() << "UTC时间:" << utcTime.toString("yyyy-MM-dd hh:mm:ss t");
qDebug() << "纽约时间:" << newYorkTime.toString("yyyy-MM-dd hh:mm:ss t");
qDebug() << "本地时间:" << localTime.toString("yyyy-MM-dd hh:mm:ss t");输出结果示例:
text
原始时间(北京): 2024-01-15 14:30:00 CST UTC时间: 2024-01-15 06:30:00 UTC 纽约时间: 2024-01-15 01:30:00 EST 本地时间: 2024-01-15 14:30:00 CST
时区偏移和夏令时
处理时区偏移
cpp
QTimeZone timeZone("America/New_York");
QDateTime dt(QDate(2024, 6, 15), QTime(14, 30, 0), timeZone);// 获取偏移量(秒)
int offset = timeZone.offsetFromUtc(dt);
int offsetHours = offset / 3600;qDebug() << "时区偏移:" << offsetHours << "小时";// 检查是否在夏令时
if (timeZone.isDaylightTime(dt)) {qDebug() << "当前处于夏令时";qDebug() << "夏令时偏移:" << timeZone.daylightTimeOffset(dt) / 3600 << "小时";
}获取时区详细信息
cpp
void printTimeZoneInfo(const QTimeZone& tz) {qDebug() << "=== 时区信息 ===";qDebug() << "ID:" << tz.id();qDebug() << "显示名称:" << tz.displayName(QTimeZone::StandardTime);qDebug() << "标准时间偏移:" << tz.standardTimeOffset() / 3600 << "小时";QDateTime now = QDateTime::currentDateTime();if (tz.hasDaylightTime()) {qDebug() << "支持夏令时";qDebug() << "当前偏移:" << tz.offsetFromUtc(now) / 3600 << "小时";qDebug() << "是否夏令时:" << tz.isDaylightTime(now);} else {qDebug() << "不支持夏令时";}qDebug() << "=================";
}// 使用示例
printTimeZoneInfo(QTimeZone("Asia/Shanghai")); // 中国时区(无夏令时)
printTimeZoneInfo(QTimeZone("America/New_York")); // 纽约时区(有夏令时)时区列表和查询
获取可用时区
cpp
// 获取所有可用的时区ID
QList<QByteArray> availableTimeZones = QTimeZone::availableTimeZoneIds();qDebug() << "可用时区数量:" << availableTimeZones.size();// 按地区筛选时区
QList<QByteArray> asiaTimeZones = QTimeZone::availableTimeZoneIds(QLocale::Asia);
QList<QByteArray> usTimeZones = QTimeZone::availableTimeZoneIds(QLocale::UnitedStates);// 显示部分时区
for (const auto& tzId : asiaTimeZones.mid(0, 5)) {qDebug() << "亚洲时区:" << tzId;
}时区工具函数
cpp
// 根据偏移量查找时区
QList<QByteArray> findTimeZonesByOffset(int offsetHours) {QList<QByteArray> result;QList<QByteArray> allZones = QTimeZone::availableTimeZoneIds();for (const auto& zoneId : allZones) {QTimeZone tz(zoneId);if (tz.standardTimeOffset() / 3600 == offsetHours) {result.append(zoneId);}}return result;
}// 使用示例
qDebug() << "UTC+8 的时区:";
auto utcPlus8 = findTimeZonesByOffset(8);
for (const auto& zone : utcPlus8) {qDebug() << " " << zone;
}
实用示例
1. 计算时间差
cpp
QDateTime start = QDateTime::currentDateTime(); // ... 执行操作 ... QDateTime end = QDateTime::currentDateTime();qint64 seconds = start.secsTo(end); // 相差秒数 qint64 days = start.daysTo(end); // 相差天数qDebug() << "操作耗时:" << seconds << "秒";
2. 日期时间验证
cpp
QDate date(2024, 2, 30); // 无效日期
if (!date.isValid()) {qDebug() << "日期无效!";date = date.addDays(-date.day() + 1); // 调整为当月第一天
}3. 全球时间显示
cpp
void displayWorldTime() {QDateTime currentUtc = QDateTime::currentDateTimeUtc();QVector<QPair<QString, QTimeZone>> cities = {{"北京", QTimeZone("Asia/Shanghai")},{"东京", QTimeZone("Asia/Tokyo")},{"伦敦", QTimeZone("Europe/London")},{"纽约", QTimeZone("America/New_York")},{"悉尼", QTimeZone("Australia/Sydney")}};qDebug() << "当前世界时间:";for (const auto& city : cities) {QDateTime cityTime = currentUtc.toTimeZone(city.second);qDebug() << city.first << ":" << cityTime.toString("yyyy-MM-dd hh:mm:ss");}
}4.处理数据库中的时区
cpp
// 从数据库读取 UTC 时间并转换为本地时间
QDateTime readFromDatabase(const QByteArray& utcData) {// 假设数据库存储的是 UTC 时间字符串QDateTime utcTime = QDateTime::fromString(utcData, Qt::ISODate);utcTime.setTimeZone(QTimeZone::utc());// 转换为本地时间显示return utcTime.toLocalTime();
}// 存储到数据库时转换为 UTC
QByteArray saveToDatabase(const QDateTime& localTime) {QDateTime utcTime = localTime.toUTC();return utcTime.toString(Qt::ISODate).toUtf8();
}