Начиная с C ++ 17 std::chrono
не имеет средств для простого разложения std::chrono::system_clock::time_point
на его каландарную дату и время на настенных часах, кроме преобразования time_point
в time_t
и использования форматирования даты / времени функциональность, унаследованная от C.
Это возможно , чтобы сделать это, используя только std::chrono
, но не просто. Например, что-то вроде этого может получить время настенных часов из std::chrono::system_clock::time_point
:
std::string time_of_day(const std::chrono::system_clock::time_point& time_point)
{
using days = std::chrono::duration<int, std::ratio<86400>>;
auto midnight = std::chrono::floor<days>(time_point);
auto time_since_midnight = time_point - midnight;
auto hours = std::chrono::floor<std::chrono::hours>(time_since_midnight);
auto minutes = std::chrono::floor<std::chrono::minutes>(time_since_midnight - hours);
auto seconds = std::chrono::floor<std::chrono::seconds>(time_since_midnight - minutes - hours);
std::ostringstream oss;
oss << hours.count() << ":" << std::setw(2) << std::setfill('0') << minutes.count() << ":" << seconds.count();
return oss.str();
}
int main() {
std::cout << time_of_day(std::chrono::system_clock::now());
}
Live Demo
Это совсем не просто, и я Конечно, есть угловые случаи, которыми я пренебрегал, но он работает только с использованием std::chrono
средств.
C ++ 20 представит несколько способов сделать это более легко. На момент написания ни одна из стандартных реализаций библиотеки не реализовала ни одну из них.
Прежде всего, если вы хотите указать полную дату / время, будет перегружен operator<<(std::ostream&, const std::chrono::system_clock::time_point&)
который отформатирует и распечатает это для вас:
int main() {
std::cout << std::chrono::system_clock::now();
}
Если вам нужна только часть даты или времени time_point
, std::chrono::day_month_year
, std::chrono::time_of_day
, и друзья могут быть использованы для разложения time_point
.
Например, вышеуказанная функция time_of_day
может быть выполнена намного проще, как это:
std::chrono::time_of_day time_of_day(const std::chrono::sytem_clock::time_point& time_point)
{
auto midnight = std::chrono::floor<std::chrono::days>(time_point);
return std::chrono::time_of_day{time_point - midnight};
}
int main() {
std::cout << time_of_day(std::chrono::system_clock::now());
}
Подробнее см. P3055 .
Другим методом является новое семейство функций std::format
. Будет std::formatter
специализация для std::chrono::system_clock::time_point
, которая позволит вам отформатировать time_point
в строку, используя strftime
-подобную строку формата. Например, вывод следующего будет очень похож (если не совпадает) с двумя предыдущими time_of_day
функциями:
int main() {
std::cout << std::format("{%T}", std::chrono::system_clock::now());
}
См. P0645 и P1361 для получения дополнительной информации.