78 lines
2.2 KiB
C++
78 lines
2.2 KiB
C++
/*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
* Point Cloud Library (PCL) - www.pointclouds.org
|
|
* Copyright (c) 2023-, Open Perception
|
|
*
|
|
* All rights reserved
|
|
*/
|
|
|
|
#include <pcl/pcl_exports.h>
|
|
|
|
#include <chrono>
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
namespace pcl {
|
|
/**
|
|
* @brief Returns a timestamp in local time as string formatted like boosts to_iso_string see https://www.boost.org/doc/libs/1_81_0/doc/html/date_time/posix_time.html#ptime_to_string
|
|
* Example: 19750101T235959.123456
|
|
* @param time std::chrono::timepoint to convert, defaults to now
|
|
* @return std::string containing the timestamp
|
|
*/
|
|
PCL_EXPORTS inline std::string
|
|
getTimestamp(const std::chrono::time_point<std::chrono::system_clock>& time =
|
|
std::chrono::system_clock::now())
|
|
{
|
|
const auto us =
|
|
std::chrono::duration_cast<std::chrono::microseconds>(time.time_since_epoch());
|
|
|
|
const auto s = std::chrono::duration_cast<std::chrono::seconds>(us);
|
|
std::time_t tt = s.count();
|
|
std::size_t fractional_seconds = us.count() % 1000000;
|
|
|
|
std::tm tm = *std::localtime(&tt); // local time
|
|
std::stringstream ss;
|
|
ss << std::put_time(&tm, "%Y%m%dT%H%M%S");
|
|
|
|
if (fractional_seconds > 0) {
|
|
ss << "." << std::setw(6) << std::setfill('0') << fractional_seconds;
|
|
}
|
|
|
|
return ss.str();
|
|
}
|
|
|
|
/**
|
|
* @brief Parses a iso timestring (see https://www.boost.org/doc/libs/1_81_0/doc/html/date_time/posix_time.html#ptime_to_string) and returns a timepoint
|
|
* @param timestamp as string formatted like boost iso date
|
|
* @return std::chrono::time_point with system_clock
|
|
*/
|
|
PCL_EXPORTS inline std::chrono::time_point<std::chrono::system_clock>
|
|
parseTimestamp(std::string timestamp)
|
|
{
|
|
std::istringstream ss;
|
|
|
|
std::tm tm = {};
|
|
|
|
std::size_t fractional_seconds = 0;
|
|
|
|
ss.str(timestamp);
|
|
ss >> std::get_time(&tm, "%Y%m%dT%H%M%S");
|
|
|
|
auto timepoint = std::chrono::system_clock::from_time_t(std::mktime(&tm));
|
|
|
|
const auto pos = timestamp.find('.');
|
|
|
|
if (pos != std::string::npos) {
|
|
const auto frac_text = timestamp.substr(pos+1);
|
|
ss.str(frac_text);
|
|
ss >> fractional_seconds;
|
|
timepoint += std::chrono::microseconds(fractional_seconds);
|
|
}
|
|
|
|
return timepoint;
|
|
}
|
|
|
|
} // namespace pcl
|