[C++0x] Реализация std::system_time
От: astral_marine  
Дата: 19.02.08 07:35
Оценка:
Необходим класс для хранения даты и времени.
Смотрел 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.
_>Может быть уже есть готовая реализация для него?

а какая именно нужна функциональность от "класса для хранения даты и времени"?

блин, сначала создал новую тему, вместо того чтоб ответить
Re[2]: [C++0x] Реализация std::system_time
От: astral_marine  
Дата: 19.02.08 09:58
Оценка:
А>а какая именно нужна функциональность от "класса для хранения даты и времени"?
Класс должен:
1. поддерживать операции сравнения и вычитания
2. поддерживать вычисления длительности интервалов с преобразованием в нужную единицу времени
3. быть межплатформенным, легким, простым в реализации и использовании
Вообще это должна быть замена ATL::COleDateTime/ATL::COleDateTimeSpan

Рассматривал boost::date_time, по пожалуй будет проще написать свой std::system_time, чем разобраться и прикрутить эту либу.
Предполагается, что этот класс будет основой для всех дат и не хотелось бы тащить в фундамент приложения такого монстра как boost::date_time.
На худой конец можно в специфических операциях сделать преобразование и использовать его, но как базу нет желания исользовать.
Re[3]: [C++0x] Реализация std::system_time
От: vtsyryuk Россия http://vladonsays.livejournal.com
Дата: 19.02.08 10:16
Оценка:
Здравствуйте, 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?
Re[4]: [C++0x] Реализация std::system_time
От: astral_marine  
Дата: 20.02.08 10:29
Оценка:
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.

Так что, чувствую, прийдется изобретать свой велосипед
Re[5]: А мне нравиться !
От: shvonder Россия  
Дата: 20.02.08 15:06
Оценка:
Здравствуйте, 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) соответсвенно) + лёгкий доступ к содержимому + фишки вроде вывода в строку + микрсекундная точность + многотысячелеьняя ось времени — кайф. Извините за эмоции, но получаю почти физичекое удовольствие от использования этой библиотеки
Кстати там в документации в разделе Детэйлс-Референсес есть ссылка на другие библиотеки.
Re: [C++0x] Реализация std::system_time
От: c-smile Канада http://terrainformatica.com
Дата: 22.02.08 04:15
Оценка: 6 (1)
Здравствуйте, astral_marine, Вы писали:

_>Необходим класс для хранения даты и времени.

_>Смотрел boost::date_time, но он не подошел, поскольку слишком сложный и нет необходимой функциональности.
_>Зато нашел, что в стандарте планируется ввести класс std::system_time.
_>Может быть уже есть готовая реализация для него?

Типа этого:
http://code.google.com/p/tiscript/source/browse/trunk/tool/tl_datetime.h
?
http://code.google.com/p/tiscript/source/browse/trunk/tool/tl_datetime.cpp
Имплементация для линукс правда не совсем полная.
Re[5]: [C++0x] Реализация std::system_time
От: Alexander Pazdnikov  
Дата: 21.03.08 14:24
Оценка:
Здравствуйте, 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)

и там уж хоть кол-во дней целых, хоть дробных , хоть что можно считать.
Получится удобно для расчета целого кол-ва вхождений одного интервала в другой

А вообще отличная библиотека, очень удобные итераторы у нее.

Да мало ли что может понадобиться, а здесь уже все есть (вопреки собственному велосипеду, который еще нужно будет отлаживать несколько месяцев и ловить жуков еще пару лет )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.