Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Locale: Working with dates, times, timezones and calendars.

Boost , ,

Working with dates, times, timezones and calendars.

Introduction

В стандартных библиотеках C, C++ и Boost есть несколько важных недостатков, которые обрабатывают даты и время:

  1. Самый большой недостаток большинства библиотек, которые предоставляют операции по датам, заключается в том, что они поддерживают только григорианский календарь.boost::date_time,std::tmи стандартные функции, такие какlocaltimeиgmtime, все принимают григорианский календарь.
  2. Информация о местном начале недели не приводится.
    Например, стандартная библиотека C и C++ имеетmktimeиlocaltime, но они не дают пользователю информацию о первом дне недели. Эта информация зависит от локализации. Во Франции понедельник, а в США воскресенье.

Повышаю. Локальный предоставляет дженерикДата_времяикалендарныеклассы, позволяющие выполнять операции по датам и времени для негрегорианских календарей, таких как иврит, исламский, японский и другие.

Не основанные на ИКУ бэкэндыподдерживают только григорианский календарь. В отличие от<boost::date_time>, они полностью осведомлены о местном первом дне недели. Таким образом, если текущий день недели является понедельником, то установка «текущего дня недели» на воскресенье переместит фактическую дату на 6 дней вперед в российских или французских местах и переместит один день назад в США и израильских местах.

Handling Dates and Time

  • boost::locale::calendar– представляет собой общую информацию о календаре, независимую от конкретной временной точки. Например, можно получить максимальное количество дней в месяц по определенному календарю.
  • boost::locale::date_time– представляет собой точку времени. Он построен из календаря и позволяет манипулировать различными периодами времени.
  • boost::locale::period– содержит список функций, которые представляют различные периоды, такие как месяц, год, день и час, позволяя манипулировать датами и временем. Вы можете добавить периоды, умножить их на целые числа, получить или установить их или добавить их кдата_времяобъектов.

Например:

using namespace boost::locale;
date_time now; // Create date_time class with default calendar initialized to current time
date_time tomorrow = now + period::day();
cout << "Let's meet tomorrow at " << as::date << tomorrow << endl;
date_time some_point = period::year(1995) + period::january() + period::day(1);
// Set some_point's date to 1995-Jan-1.
cout << "The "<< as::date << some_point << " is the "
<< as::ordinal << some_point / period::day_of_week_local() << " day of the week" << endl;

Вы можете рассчитать разницу между датами, разделив разницу на период:

date_time now;
cout << " There are " << (now + 2 * period::month() - now) / period::day() << " days "
"between " << as::date << now << " and " << now + 2*period::month() << endl;

Вы также можете использовать другой синтаксис (меньше перегрузки оператора).

date_time now;
cout << " There are " << period::day(now + period::month(2) - now) << " days "
"between " << as::date << now << " and " << now + period::month(2) << endl;

date_time– обеспечивает функции участникаминимальныеимаксимальныедля получения информации о наименьших и наибольших возможных значениях определенного периода для конкретного времени.

Например, для февраля<maximum(period::day())>будет 28 (или 29 для високосного года), а для января 31.

Note
Be very careful with assumptions about calendars. For example, in the Hebrew calendar, the number of months is different for leap years and non-leap years.

Мы рекомендуем вам посмотреть на пример<calendar.cpp>, предоставленный этой библиотекой, чтобы понять, как манипулировать датами и временем с помощью этих классов.

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

Например:

using namespace boost::locale;
using namespace boost::locale::period;
// Create locales with Hebrew and Gregorian (default) calendars.
std::locale l_hebrew=gen("en_US.UTF-8@calendar=hebrew");
std::locale l_gregorian=gen("en_US.UTF-8");
// Create a Gregorian date from fields
date_time greg(year(2010) + february() + day(5),l_gregorian);
// Assign a time point taken from the Gregorian date to date_time with
// the Hebrew calendar
date_time heb(greg.time(),l_hebrew);
// Now we can query the year.
std::cout << "Hebrew year is " << heb / year << std::endl;
Note

Не основанные на ICU бэкэнды поддерживают тот же диапазон времени даты, что и функции библиотеки<mktime>и<localtime>C.

  • Unix 32 bit: даты с 1901 по 2038 год
  • Unix 64 bit: даты от 1 до н.э.
  • Windows: датируется 1970 годом. Еслиtime_tшириной 32 бита (mingw), то верхний предел составляет 2038 год.

Time Zone

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

  1. Уровень календаря: можно указать часовой пояс при создании нового экземпляраboost::locale::calendarв его конструкторе.
  2. Уровень iostream: вы можете использоватьв качестве::time_zoneманипулятора для установки определенного часового пояса для iostream, чтобы все даты и время были представлены в этом часовом поясе.
  3. Вы можете указать глобальный часовой пояс по умолчанию, позвонив по телефону:boost::locale::time_zone::global (std::string const &). Этот часовой пояс будет по умолчанию для вновь созданных объектов iostream и календарных экземпляров.
Note

Не основанные на ИКУ бэкэндыподдерживают только два вида часовых поясов:

  1. Текущий часовой пояс ОС, поскольку он обрабатываетсяlocaltimeиmktimeстандартными функциями библиотеки - часовой пояс по умолчанию
  2. Простой часовой пояс в формате «GMT+HH:MM» — часовой пояс, представленный с использованием фиксированного сдвига от UTC без поддержки светосберегающего времени.

I/O Operations on date_time objects

Написаниедата_времяэквивалентно:

  • Применяетсякак:: Датаманипулятор на потоке
  • Написание POSIX-времени как числа, которое можно получить по телефонуdate_time::time()Функция.
  • Вернуть эффект манипулятора.

Например, этот код:

using namespace boost::locale;
std::cout << now << std::endl;

Будет печатать в формате по умолчанию, что-то вроде:

2/3/2011 12:00 am

Однако если вам нужно изменить поведение по умолчанию (например, показать только дату), то вам нужно использовать специальный манипулятор iostream для отображения текущей даты или времени, он будет переопределять форматирование по умолчанию.

Например,

using namespace boost::locale;
std::cout << as::date << now << std::endl;

Распечатал бы что-то вроде:

2/3/2011

Важно помнить, что<date_time>объект всегда отображается и анализируется в контексте<iostream's>местоположения и часового пояса, а не в контексте конкретного<date_time>объекта.

Questions and Answers

Почему я должен использовать Boost? Локальный над Ростом. Когда нужен только григорианский календарь?

  • Повышаю. DateTime является агностической библиотекой и игнорирует тот факт, что первый день недели зависит от местоположения.
  • Повышаю. Locale обеспечивает единый доступ к дате и времени в зоне времени. Он представляет собой время как универсальный скаляр - время POSIX и над ним строятся даты, местное время и обработка временных зон.
    Например,date_time(some_time.time()+ 3600)не может быть равнымsome_time + hour()из-за времени экономии дневного света.

Почему бы вам не использовать Boost? Поддержка часового пояса?

Повышаю. Поддержка часового пояса DateTime нарушена. Часовые пояса не могут быть представлены простой таблицей правил, где летнее время зависит только от определенного дня недели в месяце. Время экономии дневного света может варьироваться в зависимости от года, политических вопросов и многих других вещей.

Большинство современных операционных систем (Linux, *BSD, Mac OS X, OpenVMS) и многие важные пакеты программного обеспечения (ICU, Java, Python) используют так называемую базу данных Olson, чтобы правильно обрабатывать время дневного света.

Если вам нужна полная поддержка базы данных часового пояса, вы должны использовать библиотеку ICU.

Статья Boost.Locale: Working with dates, times, timezones and calendars. раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:39:45/0.0097301006317139/1