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.

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