2014-08-29 5 views
1

В основном я ищу стандартный способ преобразования строки типа 2014/08/29-11:42:05.042 в объект time_point. Я знаю, как это сделать с помощью boost, но можно ли это сделать только с библиотеками STL? Как?Есть ли стандартный способ преобразования std :: string в std :: chrono :: time_point без использования Boost?

Было бы здорово, если бы можно было указать формат %y/%m/%d-%H:%M:%S.%f или что-то подобное.

+0

Связанные: http://stackoverflow.com/questions/21021388 – Rufflewind

+0

Какие исследования вы проводили –

+0

@LightnessRacesinOrbit Я сделал это с помощью повышения time_facet, но я не нашел ни одного хороший способ сделать это с помощью ЗППП. –

ответ

1

Хорошо, по крайней мере, для фиксированного формата с разрешением в миллисекундах это работает. Попытка сделать этот код, способный принимать любой формат строки будет как изобретать колесо (то есть функции для всего этого в Boost.

std::chrono::system_clock::time_point string_to_time_point(const std::string &str) 
{ 
    using namespace std; 
    using namespace std::chrono; 

    int yyyy, mm, dd, HH, MM, SS, fff; 

    char scanf_format[] = "%4d.%2d.%2d-%2d.%2d.%2d.%3d"; 

    sscanf(str.c_str(), scanf_format, &yyyy, &mm, &dd, &HH, &MM, &SS, &fff); 

    tm ttm = tm(); 
    ttm.tm_year = yyyy - 1900; // Year since 1900 
    ttm.tm_mon = mm - 1; // Month since January 
    ttm.tm_mday = dd; // Day of the month [1-31] 
    ttm.tm_hour = HH; // Hour of the day [00-23] 
    ttm.tm_min = MM; 
    ttm.tm_sec = SS; 

    time_t ttime_t = mktime(&ttm); 

    system_clock::time_point time_point_result = std::chrono::system_clock::from_time_t(ttime_t); 

    time_point_result += std::chrono::milliseconds(fff); 
    return time_point_result; 
} 

std::string time_point_to_string(std::chrono::system_clock::time_point &tp) 
{ 
    using namespace std; 
    using namespace std::chrono; 

    auto ttime_t = system_clock::to_time_t(tp); 
    auto tp_sec = system_clock::from_time_t(ttime_t); 
    milliseconds ms = duration_cast<milliseconds>(tp - tp_sec); 

    std::tm * ttm = localtime(&ttime_t); 

    char date_time_format[] = "%Y.%m.%d-%H.%M.%S"; 

    char time_str[] = "yyyy.mm.dd.HH-MM.SS.fff"; 

    strftime(time_str, strlen(time_str), date_time_format, ttm); 

    string result(time_str); 
    result.append("."); 
    result.append(to_string(ms.count())); 

    return result; 
} 

Чтобы проверить это, я пытался, как это и сделал так, что строка правильно представлял текущее время дата:

auto tp_src = system_clock::now(); 
string value = time_point_to_string(tp_src); 
auto tp_cnv = string_to_time_point(value); 
auto error = duration_cast<milliseconds>(tp_src - tp_cnv).count(); 
Assert::IsTrue(error == 0); 

 Смежные вопросы

  • Нет связанных вопросов^_^