QTime的本质上是一个int,QDateTime本质上是一个qint64
研究这个问题的起因发现使用<=比较时间的不准确,所以怀疑是一个浮点数(Delphi里的time就是一个浮点数)。结果却发现是一个int
class Q_CORE_EXPORT QTime
{
explicit Q_DECL_CONSTEXPR QTime(int ms) : mds(ms)
#if defined(Q_OS_WINCE)
, startTick(NullTime)
#endif
{}
public:
Q_DECL_CONSTEXPR QTime(): mds(NullTime)
#if defined(Q_OS_WINCE)
, startTick(NullTime)
#endif
{}
QTime(int h, int m, int s = , int ms = ); Q_DECL_CONSTEXPR bool isNull() const { return mds == NullTime; }
bool isValid() const; int hour() const;
int minute() const;
int second() const;
int msec() const;
#ifndef QT_NO_DATESTRING
QString toString(Qt::DateFormat f = Qt::TextDate) const;
QString toString(const QString &format) const;
#endif
bool setHMS(int h, int m, int s, int ms = ); QTime addSecs(int secs) const Q_REQUIRED_RESULT;
int secsTo(const QTime &) const;
QTime addMSecs(int ms) const Q_REQUIRED_RESULT;
int msecsTo(const QTime &) const; Q_DECL_CONSTEXPR bool operator==(const QTime &other) const { return mds == other.mds; }
Q_DECL_CONSTEXPR bool operator!=(const QTime &other) const { return mds != other.mds; }
Q_DECL_CONSTEXPR bool operator< (const QTime &other) const { return mds < other.mds; }
Q_DECL_CONSTEXPR bool operator<=(const QTime &other) const { return mds <= other.mds; }
Q_DECL_CONSTEXPR bool operator> (const QTime &other) const { return mds > other.mds; }
Q_DECL_CONSTEXPR bool operator>=(const QTime &other) const { return mds >= other.mds; } static Q_DECL_CONSTEXPR inline QTime fromMSecsSinceStartOfDay(int msecs) { return QTime(msecs); }
Q_DECL_CONSTEXPR inline int msecsSinceStartOfDay() const { return mds == NullTime ? : mds; } static QTime currentTime();
#ifndef QT_NO_DATESTRING
static QTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
static QTime fromString(const QString &s, const QString &format);
#endif
static bool isValid(int h, int m, int s, int ms = ); void start();
int restart();
int elapsed() const;
private:
enum TimeFlag { NullTime = - };
Q_DECL_CONSTEXPR inline int ds() const { return mds == - ? : mds; }
int mds;
#if defined(Q_OS_WINCE)
int startTick;
#endif friend class QDateTime;
friend class QDateTimePrivate;
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &);
#endif
};
但是整数的比较,为什么会不准确呢?不是很理解。。。非得减去一秒之后,比较才准确。让我再想想。。。
看到里面有一个QDateTimePrivate,略加研究之后发现
同时还在qdatetime.h里发现它使用了QDateTimePrivate,搜索之后(不在磁盘上搜索,只能看到它在qdatetime.h里有一个预定义class QDateTimePrivate),发现它定义在
C:\Qt\Qt5.6.2\5.6\mingw49_32\include\QtCore\5.6.2\QtCore\private\qdatetime_p.h
C:\Qt\Qt5.6.2\5.6\Src\qtbase\src\corelib\tools\qdatetime.cpp
而不存在qdateime_p.cpp文件。
在qdatetime_p.h里发现如下定义:
class QDateTimePrivate : public QSharedData
{
public:
// Never change or delete this enum, it is required for backwards compatible
// serialization of QDateTime before 5.2, so is essentially public API
enum Spec {
LocalUnknown = -,
LocalStandard = ,
LocalDST = ,
UTC = ,
OffsetFromUTC = ,
TimeZone =
}; // Daylight Time Status
enum DaylightStatus {
NoDaylightTime = -,
UnknownDaylightTime = -,
StandardTime = ,
DaylightTime =
}; // Status of date/time
enum StatusFlag {
NullDate = 0x01,
NullTime = 0x02,
ValidDate = 0x04, // just the date field
ValidTime = 0x08, // just the time field
ValidDateTime = 0x10, // the whole object (including timezone)
SetToStandardTime = 0x40,
SetToDaylightTime = 0x80
};
Q_DECLARE_FLAGS(StatusFlags, StatusFlag) QDateTimePrivate() : m_msecs(),
m_spec(Qt::LocalTime),
m_offsetFromUtc(),
m_status(NullDate | NullTime)
{} QDateTimePrivate(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
int offsetSeconds); #ifndef QT_BOOTSTRAPPED
QDateTimePrivate(const QDate &toDate, const QTime &toTime, const QTimeZone & timeZone);
#endif // QT_BOOTSTRAPPED // ### XXX: when the tooling situation improves, look at fixing the padding.
// 4 bytes padding
qint64 m_msecs;
Qt::TimeSpec m_spec;
int m_offsetFromUtc;
#ifndef QT_BOOTSTRAPPED
QTimeZone m_timeZone;
#endif // QT_BOOTSTRAPPED
StatusFlags m_status; void setTimeSpec(Qt::TimeSpec spec, int offsetSeconds);
void setDateTime(const QDate &date, const QTime &time);
QPair<QDate, QTime> getDateTime() const; void setDaylightStatus(DaylightStatus status);
DaylightStatus daylightStatus() const; // Returns msecs since epoch, assumes offset value is current
inline qint64 toMSecsSinceEpoch() const; void checkValidDateTime();
void refreshDateTime(); // Get/set date and time status
inline bool isNullDate() const { return m_status & NullDate; }
inline bool isNullTime() const { return m_status & NullTime; }
inline bool isValidDate() const { return m_status & ValidDate; }
inline bool isValidTime() const { return m_status & ValidTime; }
inline bool isValidDateTime() const { return m_status & ValidDateTime; }
inline void setValidDateTime() { m_status |= ValidDateTime; }
inline void clearValidDateTime() { m_status &= ~ValidDateTime; }
inline void clearSetToDaylightStatus() { m_status &= ~(SetToStandardTime | SetToDaylightTime); } #ifndef QT_BOOTSTRAPPED
static qint64 zoneMSecsToEpochMSecs(qint64 msecs, const QTimeZone &zone,
QDate *localDate = , QTime *localTime = );
#endif // QT_BOOTSTRAPPED static inline qint64 minJd() { return QDate::minJd(); }
static inline qint64 maxJd() { return QDate::maxJd(); }
};
可见的此时又变成了一个qint64,它可能是QDateTime要用到的数据。于是又看了一下qdatetime的定义:
class QDateTimePrivate; class Q_CORE_EXPORT QDateTime
{
public:
QDateTime();
explicit QDateTime(const QDate &);
QDateTime(const QDate &, const QTime &, Qt::TimeSpec spec = Qt::LocalTime);
// ### Qt 6: Merge with above with default offsetSeconds = 0
QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds);
#ifndef QT_BOOTSTRAPPED
QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone);
#endif // QT_BOOTSTRAPPED
QDateTime(const QDateTime &other);
~QDateTime(); #ifdef Q_COMPILER_RVALUE_REFS
QDateTime &operator=(QDateTime &&other) Q_DECL_NOTHROW { swap(other); return *this; }
#endif
QDateTime &operator=(const QDateTime &other); void swap(QDateTime &other) Q_DECL_NOTHROW { qSwap(d, other.d); } bool isNull() const;
bool isValid() const; QDate date() const;
QTime time() const;
Qt::TimeSpec timeSpec() const;
int offsetFromUtc() const;
#ifndef QT_BOOTSTRAPPED
QTimeZone timeZone() const;
#endif // QT_BOOTSTRAPPED
QString timeZoneAbbreviation() const;
bool isDaylightTime() const; qint64 toMSecsSinceEpoch() const;
// ### Qt 6: use quint64 instead of uint
uint toTime_t() const; void setDate(const QDate &date);
void setTime(const QTime &time);
void setTimeSpec(Qt::TimeSpec spec);
void setOffsetFromUtc(int offsetSeconds);
#ifndef QT_BOOTSTRAPPED
void setTimeZone(const QTimeZone &toZone);
#endif // QT_BOOTSTRAPPED
void setMSecsSinceEpoch(qint64 msecs);
// ### Qt 6: use quint64 instead of uint
void setTime_t(uint secsSince1Jan1970UTC); #ifndef QT_NO_DATESTRING
QString toString(Qt::DateFormat f = Qt::TextDate) const;
QString toString(const QString &format) const;
#endif
QDateTime addDays(qint64 days) const Q_REQUIRED_RESULT;
QDateTime addMonths(int months) const Q_REQUIRED_RESULT;
QDateTime addYears(int years) const Q_REQUIRED_RESULT;
QDateTime addSecs(qint64 secs) const Q_REQUIRED_RESULT;
QDateTime addMSecs(qint64 msecs) const Q_REQUIRED_RESULT; QDateTime toTimeSpec(Qt::TimeSpec spec) const;
inline QDateTime toLocalTime() const { return toTimeSpec(Qt::LocalTime); }
inline QDateTime toUTC() const { return toTimeSpec(Qt::UTC); }
QDateTime toOffsetFromUtc(int offsetSeconds) const;
#ifndef QT_BOOTSTRAPPED
QDateTime toTimeZone(const QTimeZone &toZone) const;
#endif // QT_BOOTSTRAPPED qint64 daysTo(const QDateTime &) const;
qint64 secsTo(const QDateTime &) const;
qint64 msecsTo(const QDateTime &) const; bool operator==(const QDateTime &other) const;
inline bool operator!=(const QDateTime &other) const { return !(*this == other); }
bool operator<(const QDateTime &other) const;
inline bool operator<=(const QDateTime &other) const { return !(other < *this); }
inline bool operator>(const QDateTime &other) const { return other < *this; }
inline bool operator>=(const QDateTime &other) const { return !(*this < other); } #if QT_DEPRECATED_SINCE(5, 2)
QT_DEPRECATED void setUtcOffset(int seconds);
QT_DEPRECATED int utcOffset() const;
#endif // QT_DEPRECATED_SINCE static QDateTime currentDateTime();
static QDateTime currentDateTimeUtc();
#ifndef QT_NO_DATESTRING
static QDateTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
static QDateTime fromString(const QString &s, const QString &format);
#endif
// ### Qt 6: use quint64 instead of uint
static QDateTime fromTime_t(uint secsSince1Jan1970UTC);
// ### Qt 6: Merge with above with default spec = Qt::LocalTime
static QDateTime fromTime_t(uint secsSince1Jan1970UTC, Qt::TimeSpec spec,
int offsetFromUtc = );
#ifndef QT_BOOTSTRAPPED
static QDateTime fromTime_t(uint secsSince1Jan1970UTC, const QTimeZone &timeZone);
#endif
static QDateTime fromMSecsSinceEpoch(qint64 msecs);
// ### Qt 6: Merge with above with default spec = Qt::LocalTime
static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetFromUtc = );
#ifndef QT_BOOTSTRAPPED
static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone);
#endif
static qint64 currentMSecsSinceEpoch() Q_DECL_NOTHROW; #if defined(Q_OS_MAC) || defined(Q_QDOC)
static QDateTime fromCFDate(CFDateRef date);
CFDateRef toCFDate() const Q_DECL_CF_RETURNS_RETAINED;
# if defined(__OBJC__) || defined(Q_QDOC)
static QDateTime fromNSDate(const NSDate *date);
NSDate *toNSDate() const Q_DECL_NS_RETURNS_AUTORELEASED;
# endif
#endif private:
friend class QDateTimePrivate; // ### Qt6: Using a private here has high impact on runtime
// on users such as QFileInfo. In Qt 6, the data members
// should be inlined.
QSharedDataPointer<QDateTimePrivate> d; #ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &);
#endif #if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_NO_DATESTRING)
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
#endif
};
Q_DECLARE_SHARED(QDateTime)
其中最关键的是<操作符的比较,它代表了使用的真正数据,而且其它几个比较函数实质上都依赖这个操作符:
bool QDateTime::operator<(const QDateTime &other) const
{
if (d->m_spec == Qt::LocalTime
&& other.d->m_spec == Qt::LocalTime
&& d->m_status == other.d->m_status) {
return (d->m_msecs < other.d->m_msecs);
}
// Convert to UTC and compare
return (toMSecsSinceEpoch() < other.toMSecsSinceEpoch());
}
其中最关键的是toMSecsSinceEpoch函数,结果发现如下定义:
qint64 toMSecsSinceEpoch() const;
可见的QDateTime本质上是一个qint64
QTime的本质上是一个int,QDateTime本质上是一个qint64的更多相关文章
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...
- 小数运算需要注意什么? 接口和抽象类 WinForm窗体上两个panel,怎么实现一个panel固定漂浮在另一个panel之上
小数运算需要注意什么? 1. 生活中0.1+0.2=0.3, 计算机中可不是这样,为什么呢? 大家都知道计算机类型都是有数据范围的.整形int范围是 正负21亿左右,小数类型同样也是有范围的,但是即使 ...
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复 用一个ArrayList存储1到100然后随机产生0到arraylist.size()之间的数字作为下标然后从arrayli ...
- 一个int类型究竟占多少个字节
一个int占多少个字节? 这个问题我们往往得到的答案是4. 可是int究竟占多少个字节,却跟你的机器环境有关. As you can see, the typical data type sizes ...
- c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
//题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...
- leetCode中老出现的针对一个int中每个数字的处理
一个int比如322,我想找happy number就得3平方加2平方再加2平方,怎样找到一个一个的数字,就是322%10,得到2,然后/10,然后再%,就可以依次求得每位上的数字 happy num ...
- c语言int类型的变量输入一个字符出错
今天遇到一个C语言的小问题,就是写一个简单的计算器,定义一个%f%c%f的三个变量,作2+3,2-3这种可以不断输入并输入“OFF”跳出循环的计算器功能,便会出现错误: 错误的示例代码如下: #inc ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
随机推荐
- 27-ATM+购物车程序
1.需求 本章作业: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每 ...
- 「PKUSC2018」真实排名
题面 题解 因为操作为将一些数字翻倍, 所以对于一个数\(x\), 能影响它的排名的的只有满足\(2y\geq x\)或\(2x>y\)的\(y\) 将选手的成绩排序,然后考虑当前点的方案 1. ...
- Openstack入门篇(十六)之Cinder服务的部署与测试
1.理解块存储服务 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统:或者直接使用裸硬盘存储数据(数据库) 通 ...
- JAVA 删除指定目录下指定文件类型的所有文件
public class DelFile { public static void main(String[] args) { File file = new File("C:\\DETEC ...
- Error:(1, 1) java: 非法字符: ‘\ufeff’
一.问题 用IDEA打开eclipse java项目编译时,出现以下错误: Error:(1, 1) java: 非法字符: '\ufeff' Error:(1, 10) java: 需要class, ...
- 高可用注册中心 ->Spring Cloud Eureka
在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况, 所以在生产 环境中必须对各个组件进行高可用部署, 对于微服务如此, 对于服务注册中心也一样. 但 是到本节为止,我们一直都在使用单节点 ...
- VS2017+CMake+OpenCV下报错 set OpenCV_FOUND to FALSE
问题 在 VS 2017 中使用Cmake 管理项目, 使用 opencv 库, 在find package的时候出现能找到 OpenCVConfig.cmake的文件,但是设置 OpenCV_Fou ...
- 1.VBA 基本概念——《Excel VBA 程序开发自学宝典》
1.1 常见对象及含义 对象名 含义 application 整个Excel应用程序 window 窗口 worksheet 一个工作表 sheets 指定工作簿的所有工作表的合集 shaperan ...
- phpcmsv9广告版位调用方法
<div class="ya"> <?php // pc:get 使用sql语句获取指定条件的广告版位! ?> {pc:get sql="SELE ...
- 国密算法--Openssl 实现国密算法(基础介绍和产生秘钥对)
国密非对称加密算法 又称sm2,它是采取了ECC(曲线加密算法)中的一条固定的曲线,实际上就是ECC算法. 因为openssl里面不包含sm2算法,所以就要重新进行封装-. - 对于ECC算法我就不介 ...