5.2. Форматирование даты/времени в виде строки
5.2. Форматирование даты/времени в виде строки
Проблема
Требуется преобразовать дату и/или время в строковый формат
Решение
Используйте шаблон класса time_put из заголовочного файла <locale>, как показано в примере 5.4.
Пример 5.4. Форматирование строки даты/времени
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <stdexcept>
#include <iterator>
#include <sstream>
using namespace std;
ostream& formatDateTime(ostream& out, const tm& t, const char* fmt) {
const time_put<char>& dateWriter = use_facet<time_put<char> >(out.getloc());
int n = strlen(fmt);
if (dateWriter.put(out, out, , &t, fmt, fmt + n).failed()) {
throw runtime_error("невозможно отформатировать дату и время");
}
return out;
}
string dateTimeToString(const tm& t, const char* format) {
stringstream s;
formatDateTime(s, t.format);
return s.str();
}
tm now() {
time_t now = time(0);
return *localtime(&now);
}
int main() {
try {
string s = dateTimeToString(now(), "%A %B, %d %Y %I:%M%p");
cout << s << endl;
s = dateTimeToString(now(), "%Y-%m-%d %H:%M:%S);
cout << s << endl;
} catch(...) {
cerr << "невозможно отформатировать дату и время" << endl;
return EXIT FAILURE.
}
return EXIT_SUCCESS;
}
Вывод программы из примера 5.4 будет содержать нечто подобное следующему, в зависимости от локальных настроек.
Sunday July, 24 2005 05:48PM 2005-07-24 17:48:11
Обсуждение
Метод put из time_put использует спецификатор форматирования строки, аналогичный строке формата функции С printf. Символы строки формата выводятся в выходной буфер по мере их появления при условии, что им не предшествует символ %. Символ, перед которым стоит %, — это спецификатор формата, который имеет специальное значение, приведенное в табл. 5.1. Спецификаторы формата также поддерживают модификаторы, такие как целое число, указывающее длину поля, как в %4B.
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.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
6.1.3. Форматирование даты и времени
6.1.3. Форматирование даты и времени Примеры в предыдущем разделе показали, как поля в struct tm могли бы быть использованы в качестве индексов символьных строк для вывода информативных значений даты и времени. Хотя можно было бы написать собственный код, использующий такие
13.2.7. Форматирование значений даты и времени: ctime() и strftime()
13.2.7. Форматирование значений даты и времени: ctime() и strftime() В разделе 6.1 «Времена и даты» описаны функции для получения и форматирования значений времени и даты. Функция strftime() также может использовать локаль, если setlocale() была вызвана должным образом. Это демонстрирует
18.1. Вывод времени и даты
18.1. Вывод времени и даты 18.1.1. Представление времени В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC[148]. Положительные значения времени относятся к периоду после начала эпохи;
Функции даты и времени
Функции даты и времени checkdateПроверяет правильность даты/времени.Синтаксис:int checkdate(int month, int day, int year);Функция checkdate() проверяет правильность даты, заданной в ее аргументах.Возвращает true если дата, указанная как "month, day, year" (месяц, число, год), правильна, иначе false. Дата считается
1.2. Простой клиент времени и даты
1.2. Простой клиент времени и даты Рассмотрим конкретный пример, на котором мы введем многие понятия и термины, используемые в этой книге. В листинге 1.1[1] представлена реализация TCP-клиента времени и даты. Этот клиент устанавливает TCP-соединение с сервером, а сервер просто
1.5. Простой сервер времени и даты
1.5. Простой сервер времени и даты Мы можем написать простую версию сервера TCP для определения времени и даты, который будет работать с клиентом, описанным в разделе 1.2. Мы используем функции-обертки, описанные в предыдущем разделе. Код сервера приведен в листинге 1.5.Листинг
Пример: сервер времени и даты
Пример: сервер времени и даты В листинге 11.7 показан наш сервер времени и даты из листинга 4.2, переписанный с использованием функции tcp_listen.Листинг 11.7. Сервер времени и даты, переписанный с использованием функции tcp_listen//names/daytimetcpsrv1.c 1 #include "unp.h" 2 #include <time.h> 3 int 4 main(int argc, char
7.10. Контроль даты и времени
7.10. Контроль даты и времени В разделе 7.5 было показано, что стандартные функции не проверяют корректность даты, а «переносят» ее вперед, если необходимо. Например, 31 ноября становится 1 декабря.Иногда такое поведение даже желательно. А если нет, то спешу обрадовать:
7.20. Извлечение даты и времени из строки
7.20. Извлечение даты и времени из строки Дата и время могут быть представлены в виде строки самыми разными способами: в полной или сокращенной форме, с разной пунктуацией, различным порядком компонентов и т.д. Из-за такого разнообразия очень сложно написать код,
7.21. Форматирование и печать даты и времени
7.21. Форматирование и печать даты и времени Для получения канонического представления даты и времени служит метод asctime; У него есть синоним ctime.Аналогичный результат дает метод to_s. Точно такая же строка будет напечатана, если просто передать объект, представляющий дату и
5.1. Получение текущей даты и времени
5.1. Получение текущей даты и времени ПроблемаТребуется получить от пользователя компьютера текущую дату и время — либо в формате локального времени, либо в формате универсального глобального времени (Coordinated Universal Time (UTC). Григорианский календарь и високосные
3.4. Функции даты и времени
3.4. Функции даты и времени В данном разделе мы рассмотрим некоторые полезные функции, выполняющие различные операции с датами: получение текущей даты и/или времени, получение отдельных компонентов даты и/или времени, арифметические операции с датами (сложение, вычитание)
ГЛАВА 10. Типы даты и времени.
ГЛАВА 10. Типы даты и времени. Firebird поддерживает в диалекте 3 типы данных DATE, TIME и TIMESTAMP. В диалекте 1 поддерживается только один тип данных, подобный TIMESTAMP, который, хотя и называется DATE, не является взаимозаменяемым с типом DATE диалекта 3. DATE В диалекте 3 DATE хранит одну дату без
Настройка даты и времени
Настройка даты и времени Переходим к настройке даты и времени. Пожалуй, эта операция одна из самых простых среди изменений параметров работы Windows. Произвести ее можно, выбрав значок Дата и время из подраздела Дата, время, язык и региональные настройки на Панели управления.
Настройка даты и времени
Настройка даты и времени Для настройки даты и времени щелкните правой кнопкой мыши на значке часов в области уведомлений и выберите пункт Настройка даты/времени. Чтобы изменить показания часов или текущую дату, вам понадобятся полномочия администратора компьютера.