Урок №3. Дата и время в Qt5

  Дмитрий Бушуев  | 

    | 

  Обновл. 10 Сен 2019  | 

 285

 ǀ   2 

Qt5 имеет классы QDate, QTime и QDateTime для работы с датой и временем:

   QDate — это класс для работы с датой в григорианском календаре. У него есть методы для определения, сравнения и манипулирования датами.

   Класс QTime работает с часами. Он имеет методы для сравнения, определения и манипулирования временем.

   QDateTime — это класс, который объединяет QDate и QTime в одно целое.

В этом уроке мы рассмотрим почти всё, что связано с датой и временем в Qt5.

Дата и время

Объекты даты и времени могут быть инициализированы двумя основными способами: инициализация в конструкторе или создание пустых объектов и последующее их заполнение данными.

Результат выполнения программы выше:


В следующем примере мы выведем текущую дату и время на экран:

Результат выполнения программы выше:

Сравнение дат


Операторы сравнения могут использоваться для сравнения дат. Мы можем сравнивать их позиции в календаре:

Результат выполнения программы выше:

Операторы сравнения также можно использовать и с объектами классов QTime и QDateTime.

Определение високосного года

Високосный год — это год с одним дополнительным днём (29 февраля). Причиной, по которой добавляется этот день в календарь, является различие между астрономическим и календарным годом. Календарный год состоит из 365 дней. Астрономический год — это время, за которое земля делает оборот вокруг Солнца (365.25 дня). Данная разница в 6 часов приводит к тому, что за 4 года мы получаем ещё 1 дополнительные сутки. А для того, чтобы наш календарь всегда оставался актуальным, мы раз в четыре года прибавляем к февралю один дополнительный день, поэтому в григорианском календаре в високосный год февраль содержит 29 дней вместо обычных 28, а сам год состоит из 366 дней вместо обычных 365.

Статический метод QDate::isLeapYear() помогает определить, является ли год високосным. В следующей программе у нас есть список годов (с 2010 по 2016 год), среди которых мы вычисляем високосные:

Результат выполнения программы выше:

Стоит обратить внимание на то, что при инициализации списка годов, мы используем возможности стандарта языка C++11:

Скорее всего, вам потребуется дополнительно включить данную возможность в проекте. Для этого в проектный файл .pro добавьте следующее:

Предопределённые и пользовательские форматы дат


Qt5 имеет несколько встроенных форматов дат. Метод toString() класса QDate принимает формат даты в качестве параметра. По умолчанию Qt5 устанавливает формат даты как Qt::TextDate.

В следующем примере мы рассмотрим 8 предопределённых форматов отображения текущей даты:

Результат выполнения программы выше:


Дата может быть представлена и в других форматах. В Qt5 мы также можем создавать собственные форматы дат. Другая версия метода toString() принимает строку, в которой мы можем использовать различные спецификаторы. Например, спецификатор d обозначает отображение дня как числа без ведущего нуля. Спецификатор dd обозначает отображение дня как числа с ведущим нулём.

В следующей таблице перечислены доступные выражения, которые мы можем использовать для определения пользовательских форматов дат:

Выражение Вывод
d День в виде числа без ведущего нуля (от 1 до 31)
dd День в виде числа с ведущим нулем (от 01 до 31)
ddd Сокращённое название дня недели (например, от ‘Пн’ до ‘Вс’). Используется метод QDate::shortDayName().
dddd Полное название дня недели (например, от ‘Понедельник’ до ‘Воскресенье’). Используется метод QDate::longDayName().
M Месяц в виде числа без ведущего нуля (от 1 до 12)
MM Месяц в виде числа с ведущим нулём (от 01 до 12)
MMM Сокращённое название месяца (например, от ‘Янв’ до ‘Дек’). Используется метод QDate::shortMonthName().
MMMM Полное название месяца (от ‘Январь’ до ‘Декабрь’). Используется метод QDate::longMonthName().
yy Год в виде двузначного числа (от 00 до 99)
yyyy Год в виде четырёхзначного числа. Если год отрицательный, то дополнительно добавляется знак минуса.

Рассмотрим 4 варианта пользовательских форматов времени:

Результат выполнения программы выше:

Предопределённые и пользовательские форматы времени

Qt5 содержит несколько предопределённых форматов для отображения времени. Стандартные спецификаторы формата времени идентичны тем, которые используются в форматах даты. В Qt5 формат времени по умолчанию отображается с помощью Qt::TextDate.

В качестве примера давайте рассмотрим 8 предопределённых форматов отображения текущего времени:

Результат выполнения программы выше:


С помощью спецификаторов мы можем создавать пользовательские форматы времени. В таблице ниже приведен список спецификаторов, доступных для использования:

Выражение Вывод
h Час без ведущего нуля (от 0 до 23 или от 1 до 12, если включен режим AM/PM )
hh Час с ведущим нулём (от 00 до 23 или от 01 до 12, если включен режим AM/PM)
H Час без ведущего нуля (от 0 до 23, даже если включен режим AM/PM)
HH Час с ведущим нулём (от 00 до 23, даже если включен режим AM/PM)
m Минуты без ведущего нуля (от 0 до 59)
mm Минуты с ведущим нулём (от 00 до 59)
s Секунды без ведущего нуля (от 0 до 59)
ss Секунды с ведущим нулём (от 00 до 59)
z Миллисекунды без ведущего нуля (от 0 до 999)
zzz Миллисекунды с ведущим нулём (от 000 до 999)
AP или A Используется отображение AM/PM. AP будет заменён на «AM» или «PM»
ap или a Используется отображение am/pm. ap будет заменён на «am» или «pm»
t Временная зона (например, «CEST» = Центральноевропейское летнее время)

Создадим 4 пользовательских формата времени:

Результат выполнения программы выше:

Работа с днями недели


Метод dayOfWeek() возвращает число, которое представляет день недели, где 1 — это понедельник, а 7 — воскресенье. В следующей программе мы отобразим текущий день недели в формате короткого и полного названия:

Результат выполнения программы выше:


Мы можем вычислить количество дней в конкретном месяце с помощью метода daysInMonth(), а количество дней в году — с помощью метода daysInYear(). В следующем примере мы создадим пять объектов даты и вычислим количество дней в этих месяцах и в конкретном году:

Результат выполнения программы выше:

Проверка корректности даты

Для проверки корректности (валидности) даты используется метод isValid():

Результат выполнения программы выше:

Мы можем легко сосчитать, сколько дней осталось до какой-нибудь конкретной даты с помощью метода daysTo() или какая дата наступит по истечению определённого количества дней с помощью метода addDays(). Допустим, мы хотим узнать, какая дата будет через 55 дней после 11 мая 2019 года, а также сколько дней осталось до Рождества:

Результат выполнения программы выше:

Класс QDateTime

Объект QDateTime содержит календарную дату и время. Он является комбинацией классов QDate и QTime и имеет много схожих методов, а его использование идентично использованию этих двух классов. В следующем примере мы выведем на экран текущую дату и время:

Результат выполнения программы выше:

Юлианская дата

Юлианская дата — это астрономический способ измерения времени, который начинает свой отсчёт с начала Юлианского периода. Не следует путать её с Юлианским календарём. Юлианский период начался в 4713 году до нашей эры, детальнее обо всём этом вы можете почитать здесь. Помимо астрономии, Юлианские даты также часто используются военными и в мейнфреймах.

В следующей программе мы вычислим Григорианскую и Юлианскую дату для текущего дня:

Результат выполнения программы выше:

Следующий пример показывает, сколько дней прошло с момента двух исторических событий:

Результат выполнения программы выше:

UTC-время

У нас есть 24 часовых пояса. В каждом часовом поясе существует своё местное время, которое может изменяться при переходе на летнее время.

Существует потребность в едином глобальном времени. Единое глобальное время поможет избежать путаницы с часовыми поясами и переходом на летнее время. В качестве основного стандарта времени был выбран стандарт UTC (Всемирное координированное время). UTC используется в авиации, в прогнозах погоды, в управлении воздушным движением и т.д. В отличие от местного времени, UTC не меняется со сменой сезонов.

В следующем примере мы вычислим текущую дату и время, а затем выведем её в форматах UTC и локального времени:

Результат выполнения программы выше:

Unix-время

Эпоха — это момент времени, выбранный в качестве начала определённой эры. Например, в западных христианских странах эпоха времени начинается с нулевого дня: когда родился Иисус. Другой пример — французский республиканский календарь, который использовался в течение двенадцати лет. Эта эпоха была началом Республиканской эры, которая была провозглашена 22 сентября 1792 года, в день провозглашения Первой Республики и упразднения монархии.

У компьютеров также есть свои эпохи. Одной из самых популярных является эпоха Unix. Эпоха Unix — это время 00:00:00 в формате UTC 1 января 1970 года (или 1970-01-01T00:00:00Z ISO 8601). Дата и время в компьютере определяются в соответствии с количеством секунд, прошедших с определённой эпохи для этого компьютера или платформы.

Unix-время — это количество секунд, прошедших с эпохи Unix. В следующем примере мы будем использовать две функции Qt5, чтобы получить Unix-время и преобразовать его в читабельную версию:

Результат выполнения программы выше:

На этом всё! До следующего урока!

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (6 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 2

  1. Аватар Мгер:

    мне кажется есть ещё одна очень важная функция, которую не расмотрели: QClass::fromString(QSrring format), где QClass может быть как время, датой или общее

  2. Аватар Sergey:

    Классная статья )

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *