以 QMap 和 QDateTime 为键的问题
Issue with QMap and QDateTime as key
我正在使用 Qt 4.8.6 msvc 2010。
我正在开发一个软件(这是在 Qt5 之前完成的,我现在支持)。我用过地图:
QMap<QDateTime, quint32> dateTime
在我向这个地图插入一些数据后(例如有5000条数据)并且我想获取指定键的值,然后返回的值不是正确的值。为了更清楚地说明这一点,假设地图中有以下前 20 项:
[0] Sun Dec 2 23:00:00 2018 0
key Sun Dec 2 23:00:00 2018 QDateTime
value 0 unsigned int
[1] Sun Dec 2 23:15:00 2018 1
key Sun Dec 2 23:15:00 2018 QDateTime
value 1 unsigned int
[2] Sun Dec 2 23:30:00 2018 2
key Sun Dec 2 23:30:00 2018 QDateTime
value 2 unsigned int
[3] Sun Dec 2 23:45:00 2018 3
key Sun Dec 2 23:45:00 2018 QDateTime
value 3 unsigned int
[4] (invalid) 4
key (invalid) QDateTime
value 4 unsigned int
[5] Mon Dec 3 00:15:00 2018 5
key Mon Dec 3 00:15:00 2018 QDateTime
value 5 unsigned int
[6] Mon Dec 3 00:30:00 2018 6
key Mon Dec 3 00:30:00 2018 QDateTime
value 6 unsigned int
[7] Mon Dec 3 00:45:00 2018 7
key Mon Dec 3 00:45:00 2018 QDateTime
value 7 unsigned int
[8] Mon Dec 3 01:00:00 2018 8
key Mon Dec 3 01:00:00 2018 QDateTime
value 8 unsigned int
[9] Mon Dec 3 01:15:00 2018 9
key Mon Dec 3 01:15:00 2018 QDateTime
value 9 unsigned int
[10] Mon Dec 3 01:30:00 2018 10
key Mon Dec 3 01:30:00 2018 QDateTime
value 10 unsigned int
[11] Mon Dec 3 01:45:00 2018 11
key Mon Dec 3 01:45:00 2018 QDateTime
value 11 unsigned int
[12] Mon Dec 3 02:00:00 2018 12
key Mon Dec 3 02:00:00 2018 QDateTime
value 12 unsigned int
[13] Mon Dec 3 02:15:00 2018 13
key Mon Dec 3 02:15:00 2018 QDateTime
value 13 unsigned int
[14] Mon Dec 3 02:30:00 2018 14
key Mon Dec 3 02:30:00 2018 QDateTime
value 14 unsigned int
[15] Mon Dec 3 02:45:00 2018 15
key Mon Dec 3 02:45:00 2018 QDateTime
value 15 unsigned int
[16] Mon Dec 3 03:00:00 2018 16
key Mon Dec 3 03:00:00 2018 QDateTime
value 16 unsigned int
[17] Mon Dec 3 03:15:00 2018 17
key Mon Dec 3 03:15:00 2018 QDateTime
value 17 unsigned int
[18] Mon Dec 3 03:30:00 2018 18
key Mon Dec 3 03:30:00 2018 QDateTime
value 18 unsigned int
[19] Mon Dec 3 03:45:00 2018 19
key Mon Dec 3 03:45:00 2018 QDateTime
value 19 unsigned int
[20] Mon Dec 3 04:00:00 2018 20
key Mon Dec 3 04:00:00 2018 QDateTime
value 20 unsigned int
....
现在,当我尝试获取与 "Sun Dec 2 23:00:00 2018" 的键关联的值时,代码返回 14!但正确的值应该清楚地为 0(基于地图值)。这是我使用的代码:
quint32 mapValue = dateTime.value(date); // date is "Sun Dec 2 23:00:00 2018"
我编写 qt 代码超过 8 年(但主要是 Qt5),这看起来真的很奇怪。也许这不是定义地图的正确方法,或者它可能是 Qt4.8 错误。我会很感激任何帮助。谢谢
编辑:
经过调试,根据调试信息发现key#14对应的值和key#0对应的值是相等的!
看看这个:
在上图中检测到两个值相等。
我无法重现您的问题。但有一件事是肯定的,无效日期被映射到相同的值,即使它们可能被不同地初始化。
#include <QDateTime>
#include <QDebug>
#include <QMap>
int main(int argc, char** args) {
QMap<QDateTime, quint32> map;
map.clear();
for (auto iter=0; iter< 10000; iter++)
{
QDateTime invalidDateTime;
map[invalidDateTime] = iter;
}
qDebug() << map.size();
}
以下程序使用 Qt 5.13.0 打印 2
:
#include <QDateTime>
#include <QDebug>
#include <QMap>
int main(int argc, char** args) {
QMap<QDateTime, quint32> map;
QDateTime time1(QDate(2018, 12, 3), QTime(2, 30, 0));
QDateTime time2(QDate(2018, 12, 3), QTime(23, 0, 0));
map.insert(time1,0);
map.insert(time2, 1);
qDebug() << map.size();
}
刚发现问题。这是由于日期时间规范。其中一些有不同的规格
我正在使用 Qt 4.8.6 msvc 2010。 我正在开发一个软件(这是在 Qt5 之前完成的,我现在支持)。我用过地图:
QMap<QDateTime, quint32> dateTime
在我向这个地图插入一些数据后(例如有5000条数据)并且我想获取指定键的值,然后返回的值不是正确的值。为了更清楚地说明这一点,假设地图中有以下前 20 项:
[0] Sun Dec 2 23:00:00 2018 0
key Sun Dec 2 23:00:00 2018 QDateTime
value 0 unsigned int
[1] Sun Dec 2 23:15:00 2018 1
key Sun Dec 2 23:15:00 2018 QDateTime
value 1 unsigned int
[2] Sun Dec 2 23:30:00 2018 2
key Sun Dec 2 23:30:00 2018 QDateTime
value 2 unsigned int
[3] Sun Dec 2 23:45:00 2018 3
key Sun Dec 2 23:45:00 2018 QDateTime
value 3 unsigned int
[4] (invalid) 4
key (invalid) QDateTime
value 4 unsigned int
[5] Mon Dec 3 00:15:00 2018 5
key Mon Dec 3 00:15:00 2018 QDateTime
value 5 unsigned int
[6] Mon Dec 3 00:30:00 2018 6
key Mon Dec 3 00:30:00 2018 QDateTime
value 6 unsigned int
[7] Mon Dec 3 00:45:00 2018 7
key Mon Dec 3 00:45:00 2018 QDateTime
value 7 unsigned int
[8] Mon Dec 3 01:00:00 2018 8
key Mon Dec 3 01:00:00 2018 QDateTime
value 8 unsigned int
[9] Mon Dec 3 01:15:00 2018 9
key Mon Dec 3 01:15:00 2018 QDateTime
value 9 unsigned int
[10] Mon Dec 3 01:30:00 2018 10
key Mon Dec 3 01:30:00 2018 QDateTime
value 10 unsigned int
[11] Mon Dec 3 01:45:00 2018 11
key Mon Dec 3 01:45:00 2018 QDateTime
value 11 unsigned int
[12] Mon Dec 3 02:00:00 2018 12
key Mon Dec 3 02:00:00 2018 QDateTime
value 12 unsigned int
[13] Mon Dec 3 02:15:00 2018 13
key Mon Dec 3 02:15:00 2018 QDateTime
value 13 unsigned int
[14] Mon Dec 3 02:30:00 2018 14
key Mon Dec 3 02:30:00 2018 QDateTime
value 14 unsigned int
[15] Mon Dec 3 02:45:00 2018 15
key Mon Dec 3 02:45:00 2018 QDateTime
value 15 unsigned int
[16] Mon Dec 3 03:00:00 2018 16
key Mon Dec 3 03:00:00 2018 QDateTime
value 16 unsigned int
[17] Mon Dec 3 03:15:00 2018 17
key Mon Dec 3 03:15:00 2018 QDateTime
value 17 unsigned int
[18] Mon Dec 3 03:30:00 2018 18
key Mon Dec 3 03:30:00 2018 QDateTime
value 18 unsigned int
[19] Mon Dec 3 03:45:00 2018 19
key Mon Dec 3 03:45:00 2018 QDateTime
value 19 unsigned int
[20] Mon Dec 3 04:00:00 2018 20
key Mon Dec 3 04:00:00 2018 QDateTime
value 20 unsigned int
....
现在,当我尝试获取与 "Sun Dec 2 23:00:00 2018" 的键关联的值时,代码返回 14!但正确的值应该清楚地为 0(基于地图值)。这是我使用的代码:
quint32 mapValue = dateTime.value(date); // date is "Sun Dec 2 23:00:00 2018"
我编写 qt 代码超过 8 年(但主要是 Qt5),这看起来真的很奇怪。也许这不是定义地图的正确方法,或者它可能是 Qt4.8 错误。我会很感激任何帮助。谢谢
编辑:
经过调试,根据调试信息发现key#14对应的值和key#0对应的值是相等的!
看看这个:
在上图中检测到两个值相等。
我无法重现您的问题。但有一件事是肯定的,无效日期被映射到相同的值,即使它们可能被不同地初始化。
#include <QDateTime>
#include <QDebug>
#include <QMap>
int main(int argc, char** args) {
QMap<QDateTime, quint32> map;
map.clear();
for (auto iter=0; iter< 10000; iter++)
{
QDateTime invalidDateTime;
map[invalidDateTime] = iter;
}
qDebug() << map.size();
}
以下程序使用 Qt 5.13.0 打印 2
:
#include <QDateTime>
#include <QDebug>
#include <QMap>
int main(int argc, char** args) {
QMap<QDateTime, quint32> map;
QDateTime time1(QDate(2018, 12, 3), QTime(2, 30, 0));
QDateTime time2(QDate(2018, 12, 3), QTime(23, 0, 0));
map.insert(time1,0);
map.insert(time2, 1);
qDebug() << map.size();
}
刚发现问题。这是由于日期时间规范。其中一些有不同的规格