Russian Qt Forum

Qt => Общие вопросы => Тема начата: Larry от Марта 14, 2016, 15:30



Название: [РЕШЕНО]QDateTime::secsTo
Отправлено: Larry от Марта 14, 2016, 15:30
Добрый день.
Мне необходимо вычислить кол-во секунд между двумя датами.
Одна формируется из строки (данные с сервера), а вторая текущее время. Но первая дата в UTC, поэтому текущее время конвертирую тоже в UTC и при вычислении разницы через secsTo получаю разницу в два часа, хотя если вывести обе даты, то видно, что обе в UTC. Почему так происходит? Может кто-то сталкивался?

Код:
status.datetime = QDateTime(QDate::fromString(carListData[7], "ddMMyy"), QTime::fromString(carListData[1], "hhmmss"));
status.datetime.setDate(QDate(status.datetime.date().year() + 100, status.datetime.date().month(), status.datetime.date().day()));

QDateTime cur_dt(QDateTime::currentDateTime().toUTC());
int period = status.datetime.secsTo(cur_dt);

if(period > 900)
      status.communication = false;
else
      status.communication = true;


Название: Re: QDateTime::secsTo
Отправлено: Bepec от Марта 14, 2016, 16:12
А вы приведите строку с сервера. Потому что непонятна ваша проблема.
Толи у вас разница в 2 часа возникает между двумя равнозначными датами, то ли у вас ещё что-то.

PS как вариант часовой пояс разный. И передавать надо не дату тогда, а именно utc время, в количестве секунд.


Название: Re: QDateTime::secsTo
Отправлено: popper от Марта 14, 2016, 17:47
В первой строке приведенного кода конструктор вернет объект даты/времени в локальном часовом поясе, установленном в системе. Чтобы значение было в UTC, нужно конструктор вызывать с третьим параметром Qt::UTC.

http://doc.qt.io/qt-5/qdatetime.html#QDateTime-2.

хотя если вывести обе даты, то видно, что обе в UTC.

А каким образом осуществляется вывод?

PS. В Qt 4.7+ текущее время в UTC можно сразу получать вызовом
Код
C++ (Qt)
currentDateTimeUtc()
 


Название: Re: QDateTime::secsTo
Отправлено: Larry от Марта 14, 2016, 17:54
Извините, не мог ответить, т.к. не был на месте.
Вот приходят данные с сервера в таком виде:
$#GPS00000,145034,4903.1404,N,2526.9433,E,0,140316,0 ,0,A=0,B=0,SAT=f,T102=b3,T112=0,T240=0,T6=0,T66=2ed4,T67=10a4,ioEVT=0^

Текущее время (Украина +2 часа): 16:50, т.е. разница 2 часа.


Название: Re: QDateTime::secsTo
Отправлено: Larry от Марта 14, 2016, 17:55
Вывод осуществлялся в консоль .toString().


Название: Re: QDateTime::secsTo
Отправлено: Larry от Марта 14, 2016, 18:04
Вот вывод осуществляется, если привести текущее время в UTC:
datetime in point:  "14.03.16 - 14:59:55" , current datetime:  "14.03.16 - 14:59:54"
Здесь как раз выводит все нормально, т.е. текущее время преобразовано в UTC, вот что получается при определении периода:
Код:
int period = status.datetime.secsTo(cur_dt);
Выводит:
period:  7199
Вот и не могу понять, как он считает, если дату текущую преобразовал в UTC, а расчет идет так, буд-то текущее время локальное...


Название: Re: QDateTime::secsTo
Отправлено: Old от Марта 14, 2016, 18:36
Посмотрите на конструктор, с помощью которого вы создаете дату от сервера (т.е. UTC):
Код
C++ (Qt)
QDateTime(const QDate & date, const QTime & time, Qt::TimeSpec spec = Qt::LocalTime)

Вас ничего не смущает?


Название: Re: QDateTime::secsTo
Отправлено: Larry от Марта 14, 2016, 18:59
Вот теперь смутило ;D
Недосмотрел...теперь заработало...Большое СПАСИБО!