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();
}
相关推荐
紫荆鱼4 小时前
PCL实战项目-软件界面搭建RibbonUI
qt·pcl·用户界面·qml·点云处理
2739920297 小时前
qInstallMessageHandler(重定向至log文件)
开发语言·qt
火山上的企鹅1 天前
Qt C++ 软件开发工程师面试题
c++·qt·面试
Industio_触觉智能1 天前
开源鸿蒙SIG-Qt技术沙龙成都站成功举办,产品方案展示
qt·harmonyos·openharmony·开源鸿蒙·sig-qt
上去我就QWER1 天前
深入解析Qt中的QDrag:实现灵活的拖放交互
c++·qt
奔跑吧 android1 天前
【瑞芯微】【rk3128】【移植 qt 5.12.9】
qt·arm·瑞芯微·rk3128
A.A呐1 天前
【QT第三章】常用控件1
开发语言·c++·笔记·qt
CodeKwang2 天前
Qt实战:自定义搜索跳转控件 | 附完整源码
qt·qt控件
努力还债的学术吗喽2 天前
【项目】pyqt5基于python的照片整蛊项目
开发语言·python·qt