Qt: Как получить смещение GMT устройства?
Все в названии! Я разрабатываю на Qt 4.7.1, и это для Nokia N8.
Я думаю, что мне нужно использовать: QDateTime
а также timeSpec (Qt::OffsetFromUTC)
,
2 ответа
Ниже приведена функция, которая возвращает смещение UTC/GMT для любого часового пояса. Для отрицательных смещений UTC вы должны переопределить эту функцию и проверить логическое "isNegative". Я использую это для отправки запросов на сервер, если я хочу проверить, что это не день, когда часы движутся вперед или назад, я просто вызываю функцию дважды, один раз с сегодняшней датой, а затем с завтрашней датой. Если они оба возвращают то же самое, то мы знаем, что часы не переключаются в течение следующих 24 часов на летнее время.
QTime Calendar::getTimeZoneDiff(QDateTime midnightDateTime, bool &isNegative) {
midnightDateTime.setTime(QTime(0,0));
QDateTime utc = midnightDateTime.toUTC();
QDateTime local = midnightDateTime;
local.setTimeSpec(Qt::LocalTime);
QDateTime offset = local.toUTC();
QTime properTimeOffset = QTime(offset.time().hour(), offset.time().minute());
offset.setTimeSpec(Qt::LocalTime);
utc.setTimeSpec(Qt::UTC);
if(offset.secsTo(utc) < 0){
isNegative = true;
}else{
isNegative = false;
properTimeOffset.setHMS(24 - properTimeOffset.hour() - (properTimeOffset.minute()/60.0) - (properTimeOffset.second()/3600.0), properTimeOffset.minute() - (properTimeOffset.second()/60.0), properTimeOffset.second());
if(!properTimeOffset.isValid()){ //Midnight case
properTimeOffset.setHMS(0,0,0);
}
}
return properTimeOffset;
}
Мое решение также размещено здесь: Смещение часового пояса
И да и нет. Ты прав, что Qt::OffsetFromUTC
дает вам текущее значение.
Но это изменится с учетом правил перехода на летнее время для часового пояса, в котором вы находитесь. Это давно ожидаемый (еще не реализованный) запрос на добавление полной поддержки часового пояса в QDateTime
:
http://bugreports.qt-project.org/browse/QTBUG-71
Т.е. прямо сейчас, если вы используете устройство во Франции и запрашиваете смещение UTC, вы получите один час, но при переходе на летнее время в марте это изменится на два часа. Пожалуйста, имейте это в виду.