Qt QDateTime из строки с часовым поясом и летним временем - PullRequest
1 голос
/ 27 марта 2019

я вставляю время из строки

QDateTime time =QDateTime::fromString("Wed Mar 26 22:37:40 2019 GMT-08");
qDebug()<<time.toLocalTime().toString();
qDebug()<<time.toUTC().toString();
qDebug()<<time.isDaylightTime();

вывод я получаю как

  • "Вт 26 марта 23:37:40 2019"
  • "Ср 27 марта 06:37:40 2019 по Гринвичу "
  • false

он должен был дать

  • " Вт 26 марта 23:37:40 2019"
  • " Ср. 27 марта 05:37:40 2019 по Гринвичу "
  • true

как передать летнее время со строкой отметки времени?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Во-первых, время UTC «Ср 27 марта 06:37:40 2019 по Гринвичу» определенно верно, если рассчитывать по «Ср 26 марта 22:37:40 2019 по Гринвичу-08». Как вы думаете, это может быть 5:37?

Объяснение, почему GMT или UTC не включают DST:

Ни время по Гринвичу, ни по Гринвичу никогда не меняются на летнее время. Тем не менее, некоторые из стран, которые используют GMT, переключаются на другое время зоны в период их летнего времени. Например, AKDT (Аляска Дневной свет Время) является одним из часовых поясов GMT-8 во время летнего времени экономия времени) с 10 марта по 3 ноября 2019 года. зима, используется AKST (стандартное время Аляски) по Гринвичу-9.

Во-вторых, как уже было указано в другое время ответа QDateTime :: isDaylightTime always returns false if the Qt::TimeSpec is not Qt::LocalTime or Qt::TimeZone.

Когда вы используете QDateTime::fromString с информацией о часовом поясе, как в вашем примере кода, timepec правильно установлен на Qt::OffsetFromUTC. Вы можете создать экземпляр другого объекта QDateTime в то же время, но с TimeSpec в виде Qt :: LocalTime или Qt :: TimeZone. Вы можете, например, преобразовать в местное время с помощью QDateTime :: toLocalTime или либо в Qt :: LocalTime, либо в Qt :: TimeZone с помощью QDateTime :: fromSecsSinceEpoch , который принимает смещения секунд для часового пояса.

См. Пример кода ниже. Я нахожусь в Финляндии, где летнее время начинается 31 марта, поэтому вы можете увидеть разницу по местному времени, когда используется стандартное время и когда используется летнее время:

QDateTime time = QDateTime::fromString("Wed Mar 26 22:37:40 2019 GMT-08");

qDebug()<<"\nLocal time EET:";
QDateTime localTime = time.toLocalTime();
// This works too, here to local time:
//QDateTime localTime = QDateTime::fromSecsSinceEpoch(time.toSecsSinceEpoch());
qDebug()<<localTime.timeSpec();
qDebug()<<localTime.timeZone();
qDebug()<<localTime.timeZoneAbbreviation();
qDebug()<<localTime.toLocalTime().toString();
qDebug()<<localTime.toUTC().toString();
qDebug()<<localTime.isDaylightTime();

time = QDateTime::fromString("Wed Apr 26 22:37:40 2019 GMT-08");

qDebug()<<"\nLocal time EEST:";
localTime = time.toLocalTime();
qDebug()<<localTime.timeSpec();
qDebug()<<localTime.timeZone();
qDebug()<<localTime.timeZoneAbbreviation();
qDebug()<<localTime.toLocalTime().toString();
qDebug()<<localTime.toUTC().toString();
qDebug()<<localTime.isDaylightTime();

Выход:

Local time EET:
Qt::LocalTime
QTimeZone("Europe/Helsinki")
"EET"
"Wed Mar 27 08:37:40 2019"
"Wed Mar 27 06:37:40 2019 GMT"
false

Local time EEST:
Qt::LocalTime
QTimeZone("Europe/Helsinki")
"EEST"
"Sat Apr 27 09:37:40 2019"
"Sat Apr 27 06:37:40 2019 GMT"
true
2 голосов
/ 27 марта 2019

Если вы посмотрите официальные документы, там написано:

Если Qt :: TimeSpec не является Qt :: LocalTime или Qt :: TimeZone, то всегда будет возвращать false.

Итак, прежде всего, убедитесь, что QDateTime::timeSpec возвращает то, что вы ожидаете.

Если вы заранее знаете формат, попробуйте указать форматстрока, которую вы хотите проанализировать, используя эквивалентную функцию QDateTime::fromString.

Комбинируя обе вещи, вы можете сделать что-то вроде этого:

const char* s = "2009-11-05T03:54:00";
QDateTime d = QDateTime::fromString(s, Qt::ISODate).toLocalTime();
d.setTimeSpec(Qt::LocalTime); // Just to ensure that the time spec are the proper one, i think is not needed
qDebug() << d.isDaylightTime();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...