Russian Qt Forum
Ноябрь 25, 2024, 02:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Определить время по гринвичу  (Прочитано 10509 раз)
Alex_C
Гость
« : Июль 15, 2012, 15:31 »

Есть необходимость показа в программе времени по Гринвичу. В винде есть для этого специальная ф-ция , которая без проблем работает. В Qt::QDateTime.toUTC - показывает неправильное время. В инете написано - что да, это глюк. Может он уже решен как то? Опять же - под Линуксом не охото разбираться, как часовой пояс получить Улыбающийся
Записан
IMPOMEZIA
Гость
« Ответ #1 : Июль 16, 2012, 11:39 »

В чём выражается неправильность? Где в инете написано что глюк?
Записан
V1KT0P
Гость
« Ответ #2 : Июль 16, 2012, 11:49 »

Есть необходимость показа в программе времени по Гринвичу. В винде есть для этого специальная ф-ция , которая без проблем работает. В Qt::QDateTime.toUTC - показывает неправильное время. В инете написано - что да, это глюк. Может он уже решен как то? Опять же - под Линуксом не охото разбираться, как часовой пояс получить Улыбающийся
В смысле получить текущее время? Тогда QDateTime::currentDateTimeUtc().
Если ты про перевод из локального времени, то сперва надо правильно установить время, тогда перевод не должен быть неверным.
Записан
Alex_C
Гость
« Ответ #3 : Июль 16, 2012, 14:40 »

У меня московское время. От гринвича оно отличается на -4 часа. А если использовать currentDateTimeUtc - то время выдается -3 часа.
Время на компе настроено верно, и все другие программы показывают тоже верно -4 часа.
Записан
V1KT0P
Гость
« Ответ #4 : Июль 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;
}
Записан
Alex_C
Гость
« Ответ #5 : Июль 16, 2012, 15:42 »

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

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

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

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Июль 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
Записан
V1KT0P
Гость
« Ответ #8 : Июль 16, 2012, 16:29 »

Qt 4.8.1 Win7
В том то и дело что ему по видимому нужно под Линукс. На это намекает последнее предложение первого поста, но я могу ошибаться =).
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Июль 16, 2012, 17:10 »

Mac OS X 10.7.4, Киев (UTC +3)
Код:
QDateTime("пн июля 16 14:09:27 2012") QDateTime("пн июля 16 17:09:27 2012")
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex_C
Гость
« Ответ #10 : Июль 16, 2012, 17:12 »

Код
C++ (Qt)
qDebug() << QDateTime::currentDateTimeUtc() << QDateTime::currentDateTime();
QDateTime("Пн 16. июл 15:10:23 2012") QDateTime("Пн 16. июл 18:10:23 2012")
 

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

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

Записан
mutineer
Гость
« Ответ #11 : Июль 16, 2012, 17:20 »

Так у вас же теперь все время летнее время, может система не в курсе про это?
Записан
Bepec
Гость
« Ответ #12 : Июль 16, 2012, 17:22 »

Если на винде не стоит патч от микрософта, исправляющий переход на летнее/зимнее время, то наверно оно и путает Улыбающийся
Записан
Alex_C
Гость
« Ответ #13 : Июль 16, 2012, 22:31 »

Если на винде не стоит патч от микрософта, исправляющий переход на летнее/зимнее время, то наверно оно и путает Улыбающийся

Но моя то программа верно время определяет (та, что на Дельфи.)...
На счет патча не помню - ставил или нет. Ок, завтра попробую еще раз патч поставить - может он исправит положение дел.
Записан
Alex_C
Гость
« Ответ #14 : Июль 16, 2012, 22:38 »

Дома на ноуте пробовал - тут семерка стоит - все верно отображает. Значит дело в патче.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.38 секунд. Запросов: 23.