Qt5.9 格式化日期字符串

一级目录格式化时遇到的一些问题拓展定义,个性化输出格式化

一级目录

在Qt5.9中,将QDateTime格式化字符串输出,有两个相关函数:

QString QDateTime::toString(const QString &format) QStringQDateTime::toString(Qt::DateFormat format = Qt::TextDate)

常用的日期时间字符串格式化参数:

格式化参数说明举例结果yy使用两位数值表示时间当中的年份(00-99)yy.MM.dd24.02.01yyyy使用四位数值表示时间当中的月份yyyy.MM.dd2024.02.01M表示时间当中的月份(1-12)yyyy.M.dd2024.2.01MM使用两位数值表示时间当中的月份(01-12)yyyy.MM.dd2024.02.01d表示时间当中的日期(0-31)yyyy.MM.d2024.02.1dd使用两位数值表示时间当中的日期(00-31)yyyy.MM.dd2024.02.01h表示12小时制时间当中的小时数(0-12)a h:mm:sspm 5:02:01hh使用两位数值表示12小时制时间当中的小时数(00-12)a hh:mm:sspm 05:02:01H表示24小时制时间当中的小时数(0-23)H:mm:ss17:02:01HH使用两位数值表示24小时制时间当中的小时数(00-23)HH:mm:ss17:02:01m表示时间当中的小时数(0-59)HHⓂ️ss17:2:01mm使用两位数值表示时间当中的小时数(00-59)HH:mm:ss17:02:01s表示时间当中的秒数(0-59)HH:mm:s17:02:1ss使用两位数值表示时间当中的秒数(00-59)HH:mm:ss17:02:01z表示时间当中的秒数(0-999)HH:mm:ss.z17:02:01.86zzz使用两位数值表示时间当中的秒数(000-999)HH:mm:ss.zzz17:02:01.086AP/A/ap/a表示该时间处于上午/下午 (am/pm)AP HH:mm:ss下午 17:02:01ddd表示时间当中的日期名称简称yyyy.MM.dd.ddd2024.02.01.Thudddd表示时间当中的日期名称全称yyyy.MM.dd.dddd2024.02.01.ThursdayMMM表示时间当中的月份名称简称yyyy.MMM.dd2024.Feb.01MMMM表示时间当中的月份名称全称yyyy.MMMM.dd2024.February.01

格式化时遇到的一些问题

问题:使用标准日期格式化Qt::DateFormat::ISODate时,无法正确输出时区: 解决:需要先将时间转换为时区,再进行格式化输出。

//直接将当前时间进行带时区格式化

qDebug()<<"Qt::DateFormat::ISODate "<< QDateTime::currentDateTime().toString(Qt::DateFormat::ISODate);

//输出结果: Qt::DateFormat::ISODate "2024-02-19T17:34:43"

//修改为:先转换到系统时区,再格式化输出

qDebug()<<"Qt::DateFormat::ISODate "<< QDateTime::currentDateTime().toTimeZone(QTimeZone::systemTimeZone()).toString(Qt::DateFormat::ISODate);

//输出结果:Qt::DateFormat::ISODate "2024-02-19T17:34:43+08:00"

拓展定义,个性化输出格式化

在Qt5.9中,不能完美的支持时区的格式化。例如无法输出“2024.02.19T17:34:43.500+0800”这样的时区格式。可以采用手动计算时区,再用拼接字符串的形式输出。

QDateTime dateTime = QDateTime::currentDateTime();

// 获取当前时间的偏移量(以秒为单位)

int offsetSeconds = dateTime.offsetFromUtc();

// 将偏移量转换为小时和分钟

int hours = offsetSeconds / 3600;

int minutes = (offsetSeconds % 3600) / 60;

// 格式化偏移量字符串

QString sign = (hours >= 0) ? "+" : "-";

QString timeZoneString = QString("%1%2%3")

.arg(sign)

.arg(qAbs(hours), 2, 10, QChar('0')) //占用两个字符的宽度,十进制表示,使用0填充,

.arg(qAbs(minutes), 2, 10, QChar('0'));

QString dateTimeString = dateTime.toString("yyyy-MM-dd'T'HH:mm:ss.zzz%2").arg(timeZoneString);

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: