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();
}
相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能13 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G13 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt