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();
}