Здравствуйте, astral_marine, Вы писали:
_>Необходим класс для хранения даты и времени. _>Смотрел boost::date_time, но он не подошел, поскольку слишком сложный и нет необходимой функциональности. _>Зато нашел, что в стандарте планируется ввести класс std::system_time. _>Может быть уже есть готовая реализация для него?
Необходим класс для хранения даты и времени.
Смотрел boost::date_time, но он не подошел, поскольку слишком сложный и нет необходимой функциональности.
Зато нашел, что в стандарте планируется ввести класс std::system_time.
Может быть уже есть готовая реализация для него?
19.02.08 13:52: Перенесено модератором из 'C/C++' — Odi$$ey
Re: [C++0x] Реализация std::system_time
От:
Аноним
Дата:
19.02.08 09:41
Оценка:
Здравствуйте, astral_marine, Вы писали:
_>Необходим класс для хранения даты и времени. _>Смотрел boost::date_time, но он не подошел, поскольку слишком сложный и нет необходимой функциональности. _>Зато нашел, что в стандарте планируется ввести класс std::system_time. _>Может быть уже есть готовая реализация для него?
а какая именно нужна функциональность от "класса для хранения даты и времени"?
блин, сначала создал новую тему, вместо того чтоб ответить
А>а какая именно нужна функциональность от "класса для хранения даты и времени"?
Класс должен:
1. поддерживать операции сравнения и вычитания
2. поддерживать вычисления длительности интервалов с преобразованием в нужную единицу времени
3. быть межплатформенным, легким, простым в реализации и использовании
Вообще это должна быть замена ATL::COleDateTime/ATL::COleDateTimeSpan
Рассматривал boost::date_time, по пожалуй будет проще написать свой std::system_time, чем разобраться и прикрутить эту либу.
Предполагается, что этот класс будет основой для всех дат и не хотелось бы тащить в фундамент приложения такого монстра как boost::date_time.
На худой конец можно в специфических операциях сделать преобразование и использовать его, но как базу нет желания исользовать.
Здравствуйте, astral_marine, Вы писали:
А>>а какая именно нужна функциональность от "класса для хранения даты и времени"? _>Класс должен: _>1. поддерживать операции сравнения и вычитания _>2. поддерживать вычисления длительности интервалов с преобразованием в нужную единицу времени _>3. быть межплатформенным, легким, простым в реализации и использовании _>Вообще это должна быть замена ATL::COleDateTime/ATL::COleDateTimeSpan
_>Рассматривал boost::date_time, по пожалуй будет проще написать свой std::system_time, чем разобраться и прикрутить эту либу. _>Предполагается, что этот класс будет основой для всех дат и не хотелось бы тащить в фундамент приложения такого монстра как boost::date_time. _>На худой конец можно в специфических операциях сделать преобразование и использовать его, но как базу нет желания исользовать.
в общем-то boost::date_time поддерживает и 1 и 2, и на счет использования тож не вижу проблем. напиши конкретнее какая у тебя задача — что не знаешь как сделать с помощью boost::date_time?
V>в общем-то boost::date_time поддерживает и 1 и 2, и на счет использования тож не вижу проблем. напиши конкретнее какая у тебя задача — что не знаешь как сделать с помощью boost::date_time?
Например, есть вот такая реализация функции на ATL, которая определяет количество дней от определенной даты:
int getDeltaDaysFromCurrentTime(int year, int month, int day, int hour, int minute, int second)
{
return (ATL::COleDateTime::GetCurrentTime() - ATL::COleDateTime(year, month, day, hour, minute, second)).GetTotalDays();
}
Она всем устаривает, единственный недостаток — не межплатформенное решение.
Если переписать на boost::date_time, то получится:
int getDeltaDaysFromCurrentTime(int year, int month, int day, int hour, int minute, int second)
{
return (boost::posix_time::second_clock::local_time() - boost::posix_time::ptime(
boost::gregorian::date(year, month, day),
boost::posix_time::time_duration(hour, minute, second)))
.total_seconds() / 3600 / 24;
}
Здесь ряд недостатков:
1. Реализация очень усложнена. Есть second_clock::local_time, date, time_duration, а в самом коде библиотеки сходу нельзя разобраться, в отличии от ATL.
2. Тип ptime не прозрачен, почему бы не сделать просто time, который бы состоял из date и time_duration. Очевидно это нужно для нормализации представления архитектуры библиотеки. А если мне нужен простенький класс для несложных задач?
3. И пожалуй самый главный недостаток: арифметические операции. Да еще усугубляется магическими числами.
Оказывается, что в С++0х получится не намного лучше:
int getDeltaDaysFromCurrentTime(int year, int month, int day, int hour, int minute, int second)
{
struct tm t = { second, minute, hour, day, month, year };
return (std::get_system_time() - std::system_time(std::mktime(&t)))
/ std::nanosecond::ticks_per_second / std::hour::hours_per_tick / 24 ;
}
Тоже, что и boost::date_time, но библиотека должна быть в реализации попроще — как легкий враппер над time_t.
Так что, чувствую, прийдется изобретать свой велосипед
Здравствуйте, astral_marine, Вы писали:
_>Например, есть вот такая реализация функции на ATL, которая определяет количество дней от определенной даты: _>
_>int getDeltaDaysFromCurrentTime(int year, int month, int day, int hour, int minute, int second)
_>{
_> return (ATL::COleDateTime::GetCurrentTime() - ATL::COleDateTime(year, month, day, hour, minute, second)).GetTotalDays();
_>}
_>
_>Она всем устаривает, единственный недостаток — не межплатформенное решение.
По-моему, так нет недостатков в boost::date_time !!
using namespace std;
using namespace boost;
using namespace gregorian;
using namespace posix_time;
int getDeltaDaysFromCurrentTime(int year, int month, int day, int hour, int minute, int second)
{
ptime t = ptime(date(year, month, day),time_duration( hour, minute, second));
ptime now = second_clock::local_time();
return (t-now).ticks()/hours(24).ticks();
}
_>Тоже, что и boost::date_time, но библиотека должна быть в реализации попроще — как легкий враппер над time_t. _>Так что, чувствую, прийдется изобретать свой велосипед
Вообще вкусы у всех разные, кому-то нравиться яблоки, кому-то велосипеды
Я считаю, что незачем пользоваться int year,int month,..,int microsec и уж тем более time_t. Нужно сразу использовать ptime и date . Они расчитаны на передачу по значению (размер 2*sizeof(long) и sizeof(long) соответсвенно) + лёгкий доступ к содержимому + фишки вроде вывода в строку + микрсекундная точность + многотысячелеьняя ось времени — кайф. Извините за эмоции, но получаю почти физичекое удовольствие от использования этой библиотеки
Кстати там в документации в разделе Детэйлс-Референсес есть ссылка на другие библиотеки.
Здравствуйте, astral_marine, Вы писали:
_>Если переписать на boost::date_time, то получится: _>
_>int getDeltaDaysFromCurrentTime(int year, int month, int day, int hour, int minute, int second)
_>{
_> return (boost::posix_time::second_clock::local_time() - boost::posix_time::ptime(
_> boost::gregorian::date(year, month, day),
_> boost::posix_time::time_duration(hour, minute, second)))
_> .total_seconds() / 3600 / 24;
_>}
_>
_>Здесь ряд недостатков: _>1. Реализация очень усложнена. Есть second_clock::local_time, date, time_duration, а в самом коде библиотеки сходу нельзя разобраться, в отличии от ATL.
Есть оператор int operator/(time_duration)
Хорошее решение определить оператор
int operator/(time_duration,time_duration)
и там уж хоть кол-во дней целых, хоть дробных , хоть что можно считать.
Получится удобно для расчета целого кол-ва вхождений одного интервала в другой
А вообще отличная библиотека, очень удобные итераторы у нее.
Да мало ли что может понадобиться, а здесь уже все есть (вопреки собственному велосипеду, который еще нужно будет отлаживать несколько месяцев и ловить жуков еще пару лет )