- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
C++. Сборник рецептов - Д. Стефенс
Шрифт:
Интервал:
Закладка:
Tабл. 5.1. Спецификаторы формата даты/времени
Спецификатор Описание a Сокращенное название дня недели (например, Mon (пн)) A Полное название дня недели (например, Monday (понедельник)) b Сокращенное название месяца (например, Dec (дек)) B Полное название месяца (например, May (май)) c Полные дата и время d День месяца (01-31) H Час (00-23) I Час (01-12) j День года (001-366) m Месяц (01-12) M Минуты (00-59) p Признак AM/PM S Секунды, включая до двух секунд координации U Номер недели (00-53), причем неделя 1 начинается в первое воскресенье w День недели (0-6), где 0 — это воскресенье W Номер недели (00-53), причем неделя 1 начинается в первый понедельник x Дата в формате MM/DD/YY X Время в формате HH/MM/SS и 24-часовыми часами y Год текущего столетия (00-99) Y Год Z Сокращение временной зоны (часового пояса), или пустая строка, если зона неизвестнаБиблиотека Boost date_time, обсуждаемая в дальнейших рецептах, не содержит возможностей форматирования, предлагаемых time_put. Для удобства пример 5.5 содержит несколько процедур, преобразующих классы даты/времени Boost в формат структуры tm, так что вы можете использовать процедуры time_put.
Пример 5.5. Преобразование из классов даты/времени Boost в структуру tm
using boost::gregorian;
using boost::posix_time;
void dateToTmAux(const date& src, tm& dest) {
dest.tm_mday = src.day();
dest tm_year = src.year() - 1900;
dest.tm_mon = src.month() - 1;
}
void ptimeToTmAux(const ptime& src, tm& dest) {
dest.tm_sec = src.seconds();
dest.tm_min = st.minutes();
dest.tm_hour = src.hours();
dateToTmAux(src.date(), dest);
}
tm ptimeToTm(const ptime& t) {
tm ret = tm();
ptimeToTmAux(t.ret);
return ret;
}
Смотри такжеРецепт 13.3.
5.3. Выполнение вычислений с датами и временем
ПроблемаТребуется узнать количество времени, прошедшего между двумя точками даты/времени.
РешениеЕсли обе временные точки находятся между 1970 и 2038 годами, то используйте тип time_t и функцию difftime, определенную в заголовочном файле <ctime>. Пример 5.6 показывает, как вычислить число дней, прошедших между двумя датами.
Пример 5.6. Вычисление даты и времени в формате time_t
#include <ctime>
#include <iostream>
#include <cstdlib>
using namespace std;
time_t dateToTimeT(int month, int day, int year) {
// 5 января 2000 года передается как (1, 5, 2000)
tm tmp = tm();
tmp.tm_mday = day;
tmp.tm_mon = month - 1;
tmp.tm_year = year - 1900;
return mktime(&tmp);
}
time_t badTime() {
return time_t(-1);
}
time_t now() {
return time(0);
}
int main() {
time_t date1 = dateToTimeT(1,1,2000);
time_t date2 = dateToTimeT(1,1,2001);
if ((date1 == badTime()) || (date2 == badTime())) {
cerr << "невозможно создать структуру time_t" << endl;
return EXIT_FAILURE;
}
double sec = difftime(date2, date1);
long days = static_cast<long>(sec / (60 * 60 — 24));
cout << число дней между 1 января 2000 г. и 1 января 2001 г. составляет ";
cout << days << endl;
return EXIT_SUCCESS;
}
Программа из примера 5.6 должна вывести:
число дней между 1 января 2000 г. и 1 января 2001 г. составляет 366
Обратите внимание, что 2000 год високосный, так как, несмотря на то что он делится на 100, он также делится и на 400 и, следовательно, состоит из 366 дней.
ОбсуждениеТип time_t — это зависящий от реализации арифметический тип. Это означает, что это либо целый тип, либо тип с плавающей точкой, и, таким образом, он поддерживает основные арифметические операции. Его можно складывать, вычитать, делить, умножать и т.д. Чтобы вычислить интервал между двумя значениями time_t в секундах, используйте функцию difftime. Не думайте, что сам time_t содержит секунды, даже если это и так. Многие реализации C++ могут в ближайшем будущем молча изменить его так, чтобы он содержал доли секунд (это одна из причин, по которым difftime возвращает double).
Если ограничения time_t слишком жестки, то вместо него для вычисления временных интервалов потребуется использовать различные классы из библиотеки Boost date_time. Пример 5.7 показывает, как использовать классы Boost для вычисления числа дней в 20-м и 21-м столетиях.
Пример 5.7. Вычисление даты и времени с помощью date_duration
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace std;
using namespace boost::gregorian;
int main() {
date_duration dd = date(2000, 1, 1) - date(1900, 1, 1);
cout << "Двадцатый век содержал " << dd.days() << " дней" << endl;
dd = date(2100, 1, 1) - date(2000, 1, 1);
cout << "Двадцать первый век будет содержать " <<
dd.days() << " дней" << endl;
}
Программа из примера 5.7 должна вывести:
Двадцатый век содержал 36 524 дней
Двадцать первый век будет содержать 36 525 дней
5.4. Преобразование между часовыми поясами
ПроблемаТребуется преобразовать текущее время из одного часового пояса в другой.
РешениеЧтобы выполнить преобразование между часовыми поясами, используйте процедуры преобразования часовых поясов из библиотеки Boost date_time. Пример 5.8 показывает, как, зная время в Нью-Йорке, определить время в Туксоне, Аризона.
Пример 5.8. Преобразование между часовыми поясами
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
using namespace std;
using namespace boost::gregorian;
using namespace boost::date_time;
using namespace boost::posix_time;
typedef local_adjustor<ptime, -5, us_dst> EasternTZ;
typedef local_adjustor<ptime, -7, no_dst> ArizonaTZ;
ptime NYtoAZ(prime nytime) {
ptime utctime = EasternTZ::local_to_utc(nytime);
return ArizonaTZ::utc_to_local(utctime);
}
int main() {
// May 1st 2004.
boost::gregorian::date thedate(2004, 6, 1);
ptime nytime(thedate, hours(19)); // 7 pm
ptime aztime = NYtoAZ(nytime);
cout << "1 мая 2004 г. когда было " << nytime.time_of_day().hours();
cout << ":00 часов в Нью-Йорке, было " << aztime.time_of_day().hours();
cout << ":00 часов в Аризоне" << endl;
}
Программа из примера 5.8 выводит следующее.
1 мая 2004 г., когда было 19:00 часов в Нью-Йорке, было 16:00 часов в Аризоне
ОбсуждениеПреобразование часовых поясов в примере 5.8 выполняется в два шага. Вначале время преобразуется в UTC, а затем время в UTC преобразуется во второй часовой пояс. Заметьте, что часовые пояса в библиотеке Boost date_time представлены как типы, использующие шаблон класса local_adjustor. Каждый тип содержит функции преобразования, которые преобразуют из данного часового пояса в UTC (функция local_tc_utс) и из UTC в данный часовой пояс (функция utc_to_local).
5.5. Определение номера дня в году

