Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert Date-Time to Milliseconds - C++ - cross platform

Tags:

c++

posix

I want to convert a string in the format of "20160907-05:00:54.123" into milliseconds. I know that strptime is not available in Windows and I want to run my program in both windows and linux. I can't use third party libraries as well. I can tokenize the string and convert it. But is there a more elegant way like using the strptime to do so?

like image 250
Will_Panda Avatar asked Sep 12 '25 18:09

Will_Panda


2 Answers

What about std::sscanf?

#include <iostream>
#include <cstring>

int main() {
    const char *str_time = "20160907-05:00:54.123";
    unsigned int year, month, day, hour, minute, second, miliseconds;

    if (std::sscanf(str_time, "%4u%2u%2u-%2u:%2u:%2u.%3u", &year, &month,
               &day, &hour, &minute, &second,&miliseconds) != 7)
    {
        std::cout << "Parse failed" << std::endl;
    } 
    else
    {
        std::cout << year << month << day << "-" << hour << ":" 
                  << minute << ":" << second << "." << miliseconds
                  << std::endl;
    }
}

Output (ideone): 201697-5:0:54.123.

However, you should make sure the input is valid (for example, day can be in the range of [0,99]).

like image 73
Shmuel H. Avatar answered Sep 14 '25 07:09

Shmuel H.


Too bad about no 3rd party libraries, because here is one (MIT license) that is just a single header, runs on linux and Windows, and handles the milliseconds seamlessly:

#include "date.h"
#include <iostream>
#include <sstream>

int
main()
{
    date::sys_time<std::chrono::milliseconds> tp;
    std::istringstream in{"20160907-05:00:54.123"};
    date::parse(in, "%Y%m%d-%T", tp);
    std::cout << tp.time_since_epoch().count() << '\n';
}

This outputs:

1473224454123

Error checking is done for you. The stream will fail() if the date is invalid.

date::sys_time<std::chrono::milliseconds> is a type alias for std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>. I.e. it is from the family of system_clock::time_point, just milliseconds precision.

Fully documented:

https://howardhinnant.github.io/date/date.html

Doesn't get much more elegant than this.

like image 40
Howard Hinnant Avatar answered Sep 14 '25 09:09

Howard Hinnant