wxWidgets Глава 1. Вспомогательные классы. Часть 2. Дата и время

wxWidgets предоставляет набор мощных классов для работы с датой и временем.

Некоторые из поддерживаемых функций класса wxDateTime :

  • Широкий диапазон: диапазон поддерживаемых дат колеблется от примерно 4714 г. до н.э. до примерно 480 миллионов лет в будущем.
  • Точность: нигде не используются вычисления с плавающей запятой, что гарантирует отсутствие ошибок округления при вычислениях даты.
  • Многие функции: поддерживаются не только все обычные вычисления с датами, но и более экзотические вычисления дней недели и года, тестирование рабочего дня, стандартные астрономические функции, преобразование в строки и из строк в строгом или свободном формате.
  • Эффективность: объекты wxDateTime имеют небольшой размер (8 байт), и работа с ними выполняется быстро.

В wxWidgets есть несколько классов для работы с датой и временем.

Для того чтобы работать с классом wxDateTime нужно подключить:

#include <wx/datetime.h>

Следующий пример показывает системную дату и время в различных форматах.

Функция wxDateTime::Now() возвращает объект, соответствующий текущему времени в местном часовом поясе.

Метод Format() сохраняет в виде строки все эти данные или их часть, выделенную спецификатором формата. Format() работает так же, как стандартная strftime функция ANSI C (http://www.cplusplus.com/reference/clibrary/ctime/strftime.html). спецификаторы формата.

Теперь попробуем вывести текущее время в разных городах.

wxDateSpan и wxTimeSpan

Хотя существует только один логический способ представления абсолютного момента времени (и, следовательно, только один класс wxDateTime ), существует как минимум два метода для описания временного интервала.

Во-первых, есть прямой и самоочевидный способ, реализованный wxTimeSpan : это просто разница в миллисекундах между двумя моментами времени. Добавление или вычитание такого интервала к wxDateTime всегда четко определено и является быстрой операцией.

Но в повседневной жизни используются другие, зависящие от календаря, временные интервалы. Например, обычно используется «месяц спустя». Однако ясно, что это не то же самое, что wxTimeSpan 60 * 60 * 24 * 31 секунда, потому что «один месяц спустя» 15 февраля - это 15 марта, а не 17 или 16 марта (в зависимости от того, является ли год високосным или нет. ).

Вот почему существует другой класс для представления таких интервалов, называемый wxDateSpan . Он обрабатывает такие операции наиболее естественным образом, но обратите внимание, что манипуляции с такими интервалами не всегда четко определены. Рассмотрим, например, 31 января + «1 месяц»: это даст 28 (или 29) февраля, то есть последний день февраля, а не несуществующий 31 февраля. Конечно, это то, что обычно требуется, но вы все еще может быть удивлен, заметив, что теперь вычитание того же самого интервала из 28 февраля приведет к 28 января, а не 31 января, с которого мы начали!

Итак, если вы не планируете реализовывать в программе какой-либо анализ естественного языка, вам, вероятно, следует использовать wxTimeSpan вместо wxDateSpan (что также более эффективно). Однако wxDateSpan может быть очень полезен в ситуациях, когда вам действительно нужно понять, что означает «через месяц» (конечно, это просто wxDateTime::Now()+ wxDateSpan :: Month () ).

Следующий пример показывает как можно увеличить время/дату на некоторый интервал. Добавим один месяц к текущей дате.
Следующий пример показывает как превратить дату в формат количество миллисекунд с 1 января 1970 года по всемирному координированному времени