当前位置: 首页 > news >正文

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

格式化字符串

常用格式符
格式符含义示例
yyyy4位数年份2024
MM2位数月份01, 12
dd2位数日期05, 25
hh2位数小时(00-23)14, 08
mm2位数分钟05, 45
ss2位数秒钟09, 59
zzz3位数毫秒123
apAM/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();
}
http://www.dtcms.com/a/585544.html

相关文章:

  • 有哪些网站上可以做试卷网站备案黑名单
  • Vue 项目实战《尚医通》,axios 二次封装与代理跨域的设置,笔记10
  • Rust编程学习 - mod (模块)是用于在crate 内部继续进行分层和封装的机制
  • 物联网中台搭建以及规则定义
  • 怎么做自己优惠券网站做网站聊城
  • 实时大数据计算中,windowDuration,slideDuration,trigger,watermark的关系
  • 网站建设开场介绍话术常德投诉网站
  • FetchAPI 请求流式数据 基本用法
  • C#知识补充(二)——命名空间、泛型、委托和事件
  • 就业|高校就业|基于ssm+vue的高校就业信息系统的设计与实现(源码+数据库+文档)
  • 县网站建设网页设计与制作教案模板
  • 无线通信是如何实现的
  • 【开题答辩实录分享】以《植物爱好者交流平台的设计与实现》为例进行答辩实录分享
  • 【打靶日记】HackMyVM 之 Aria
  • 零基础学AI大模型之LangChain Embedding框架全解析
  • 使用Procise打包和烧写BOOT.bin文件
  • 哪个网站做课件能赚钱网站建设的费用是不是含税的
  • 大朗仿做网站深圳做网站推广哪家好
  • 电力分配的艺术:从城市供电到二分查找的奇妙旅程
  • CentOS7 使用RDO部署单节点Train版OpenStack
  • Verilog运算符
  • Redis入门 - 基本概念和九种数据类型
  • mc数学库
  • CodeBuddy接入GLM4.6:新一代AI编程助手的能力革命与性能突破
  • 网站备案个人好还是企业好wordpress新文章数据库
  • 用html5写一个打巴掌大赛
  • 基于python大数据的高考志愿推荐系统
  • Web APIs 学习第五天:日期对象与DOM节点
  • windows 根据端口号关闭进程脚本
  • 推荐电商网站建设微信小程序商城制作一个需要多少钱