Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alex_C от Июль 15, 2012, 15:31



Название: Определить время по гринвичу
Отправлено: Alex_C от Июль 15, 2012, 15:31
Есть необходимость показа в программе времени по Гринвичу. В винде есть для этого специальная ф-ция , которая без проблем работает. В Qt::QDateTime.toUTC - показывает неправильное время. В инете написано - что да, это глюк. Может он уже решен как то? Опять же - под Линуксом не охото разбираться, как часовой пояс получить :)


Название: Re: Определить время по гринвичу
Отправлено: IMPOMEZIA от Июль 16, 2012, 11:39
В чём выражается неправильность? Где в инете написано что глюк?


Название: Re: Определить время по гринвичу
Отправлено: V1KT0P от Июль 16, 2012, 11:49
Есть необходимость показа в программе времени по Гринвичу. В винде есть для этого специальная ф-ция , которая без проблем работает. В Qt::QDateTime.toUTC - показывает неправильное время. В инете написано - что да, это глюк. Может он уже решен как то? Опять же - под Линуксом не охото разбираться, как часовой пояс получить :)
В смысле получить текущее время? Тогда QDateTime::currentDateTimeUtc().
Если ты про перевод из локального времени, то сперва надо правильно установить время, тогда перевод не должен быть неверным.


Название: Re: Определить время по гринвичу
Отправлено: Alex_C от Июль 16, 2012, 14:40
У меня московское время. От гринвича оно отличается на -4 часа. А если использовать currentDateTimeUtc - то время выдается -3 часа.
Время на компе настроено верно, и все другие программы показывают тоже верно -4 часа.


Название: Re: Определить время по гринвичу
Отправлено: V1KT0P от Июль 16, 2012, 15:22
У меня московское время. От гринвича оно отличается на -4 часа. А если использовать currentDateTimeUtc - то время выдается -3 часа.
Время на компе настроено верно, и все другие программы показывают тоже верно -4 часа.
У меня например работает нормально. Время по гринвичу получает стандартными средствами С++(Наверно стоит в этом направлении копать):
Код
C++ (Qt)
QDateTime QDateTime::currentDateTimeUtc()
{
   // posix compliant system
   // we have milliseconds
   struct timeval tv;
   gettimeofday(&tv, 0);
   time_t ltime = tv.tv_sec;
   struct tm *t = 0;
 
#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
   // use the reentrant version of localtime() where available
   struct tm res;
   t = gmtime_r(&ltime, &res);
#else
   t = gmtime(&ltime);
#endif
 
   QDateTime dt;
   dt.d->time.mds = msecsFromDecomposed(t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
 
   dt.d->date.jd = julianDayFromDate(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);
   dt.d->spec = QDateTimePrivate::UTC;
   return dt;
}


Название: Re: Определить время по гринвичу
Отправлено: Alex_C от Июль 16, 2012, 15:42
Время по гринвичу - это платформо-зависимый код, и c++ тут не причем.
На винде время по гринвичу определяется с помощью WinAPI:
TIME_ZONE_ID_DAYLIGHT = GetTimeZoneInformation(UTC_ZONE)


Название: Re: Определить время по гринвичу
Отправлено: V1KT0P от Июль 16, 2012, 16:15
Время по гринвичу - это платформо-зависимый код, и c++ тут не причем.
На винде время по гринвичу определяется с помощью WinAPI:
TIME_ZONE_ID_DAYLIGHT = GetTimeZoneInformation(UTC_ZONE)

Дык в состав стандартных библиотек С++ входит С библиотека "C Time Library", в которой есть функции получения времени по гринвичу. Кстати под виндой используется GetSystemTime =). Кстати тот кусок что я выше привел он для UNIX систем, он вроде как раз и используется под Линуксом.


Название: Re: Определить время по гринвичу
Отправлено: LisandreL от Июль 16, 2012, 16:23
У меня московское время. От гринвича оно отличается на -4 часа. А если использовать currentDateTimeUtc - то время выдается -3 часа.
Время на компе настроено верно, и все другие программы показывают тоже верно -4 часа.
Код
C++ (Qt)
qDebug() << QDateTime::currentDateTimeUtc() << QDateTime::currentDateTime();
QDateTime("Пн 16. июл 13:20:20 2012") QDateTime("Пн 16. июл 17:20:20 2012")
Qt 4.8.1 Win7


Название: Re: Определить время по гринвичу
Отправлено: V1KT0P от Июль 16, 2012, 16:29
Qt 4.8.1 Win7
В том то и дело что ему по видимому нужно под Линукс. На это намекает последнее предложение первого поста, но я могу ошибаться =).


Название: Re: Определить время по гринвичу
Отправлено: kambala от Июль 16, 2012, 17:10
Mac OS X 10.7.4, Киев (UTC +3)
Код:
QDateTime("пн июля 16 14:09:27 2012") QDateTime("пн июля 16 17:09:27 2012")


Название: Re: Определить время по гринвичу
Отправлено: Alex_C от Июль 16, 2012, 17:12
Код
C++ (Qt)
qDebug() << QDateTime::currentDateTimeUtc() << QDateTime::currentDateTime();
QDateTime("Пн 16. июл 15:10:23 2012") QDateTime("Пн 16. июл 18:10:23 2012")
 

Часовой пояс - Москва.
Галочка перехода на летнее время не стоит.

Не понятно...



Название: Re: Определить время по гринвичу
Отправлено: mutineer от Июль 16, 2012, 17:20
Так у вас же теперь все время летнее время, может система не в курсе про это?


Название: Re: Определить время по гринвичу
Отправлено: Bepec от Июль 16, 2012, 17:22
Если на винде не стоит патч от микрософта, исправляющий переход на летнее/зимнее время, то наверно оно и путает :)


Название: Re: Определить время по гринвичу
Отправлено: Alex_C от Июль 16, 2012, 22:31
Если на винде не стоит патч от микрософта, исправляющий переход на летнее/зимнее время, то наверно оно и путает :)

Но моя то программа верно время определяет (та, что на Дельфи.)...
На счет патча не помню - ставил или нет. Ок, завтра попробую еще раз патч поставить - может он исправит положение дел.


Название: Re: Определить время по гринвичу
Отправлено: Alex_C от Июль 16, 2012, 22:38
Дома на ноуте пробовал - тут семерка стоит - все верно отображает. Значит дело в патче.