Преобразование миллисекундного UTC в человекочитаемый Date_Time
Я изо всех сил пытаюсь выяснить, как выполнить преобразование с помощью boost::date_time. Я хочу преобразовать значение в миллисекундах, измеренное с эпохи Unix (00:00, 1 января 1970 г.), в читаемую человеком строку - что-то вроде: 2/13/2012 15:20:11
было бы идеально.
Я попробовал несколько советов по стандарту C++ / boost, которые я видел, но пока что мне не повезло. Вот код, который я использую:
long long ticksFromEpoch = 1329117220501;
std::time_t tt = static_cast<time_t>(ticksFromEpoch);
boost::posix_time::ptime dt = boost::posix_time::from_time_t(tt);
// Create a time_zone_ptr for the desired time zone and use it to create a local_date_time
boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("UTC"));
boost::local_time::local_date_time dt_with_zone(dt, zone);
std::stringstream strm;
strm.imbue(std::locale(std::cout.getloc(), new boost::local_time::local_time_facet("%Y-%m-%d %H:%M:%S"))); // 15:14
strm << dt_with_zone;
// Print the stream's content to the console
std::cout << strm.str() << std::endl;
Выход: 2032-07-01 20:20:37
что явно неверно. Я подозреваю, что я не строю ticksFromEpoch
переменная правильно, но я не уверен, почему. Может кто-то указать мне верное направление? Любая помощь высоко ценится!!
1 ответ
time_t
как правило, секунд с "эпохи", а не миллисекунд. Если вас не волнуют миллисекунды, вы можете сделать это:
std::time_t tt = static_cast<time_t>(ticksFromEpoch/1000)
Если вам небезразличны миллисекунды, вы можете либо добавить их обратно в конце (что сложно сделать правильно в такие моменты, как 12:00:00.001 AM)
Или вам нужно пойти другим путем. Вам может понадобиться что-то вроде этого: (не проверено)
boost::posix_time::ptime t2(
date(1970,Jan,1), //The epoch
boost::posix_time::seconds( ticksFromEpoch / 1000 ) + // Number of seconds
boost::posix_time::microseconds( ticksFromEpoch % 1000) // And the micros too.
);