C++ 从C+中的std::chrono::time_点提取年/月/日等+;

C++ 从C+中的std::chrono::time_点提取年/月/日等+;,c++,time,c++11,chrono,C++,Time,C++11,Chrono,如何从std::chrono::time\u point对象中提取年、月、日、时、分、秒和毫秒 我只看到了如何从持续时间中提取总秒数的示例您只能从系统时钟::时间点中提取此信息。这是系统提供的唯一一个与民用日历相关的时钟。以下是如何使用此时钟获取当前时间点: system_clock::time_point now = system_clock::now(); 然后,您可以使用以下方法将其转换为时间: time_t tt = system_clock::to_time_t(now); 然后

如何从
std::chrono::time\u point
对象中提取年、月、日、时、分、秒和毫秒


我只看到了如何从
持续时间中提取总秒数的示例

您只能从
系统时钟::时间点中提取此信息。这是系统提供的唯一一个与民用日历相关的时钟。以下是如何使用此时钟获取当前时间点:

 system_clock::time_point now = system_clock::now();
然后,您可以使用以下方法将其转换为时间:

time_t tt = system_clock::to_time_t(now);
然后,使用C库,您可以将
时间\u t
转换为
tm
,但您必须选择是在UTC时区进行转换,还是在本地时区进行转换:

tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);
然后您可以打印出tm的组件,例如:

std::cout << local_tm.tm_year + 1900 << '\n';
std::cout << local_tm.tm_mon + 1 << '\n';
std::cout << local_tm.tm_mday << '\n';
可以方便地为模型天数创建自定义的
持续时间

typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
然后把它截成天,然后减去它

然后把它截成小时,再减去它

继续,直到减去秒数

剩下的是以
system\u clock::duration
为单位的几分之一秒。所以打印出运行时值和该值的编译时单位,如图所示

对我来说,该程序打印出:

15806d 20:31:14 598155[1/1000000]
2013-4-11 20:31:14
我的输出表明
系统时钟::持续时间
精度为微秒。如果需要,可以使用以下命令将其截断为毫秒:

milliseconds ms = duration_cast<milliseconds>(tp);
另一次更新

<>这个库成长为C++标准提案,现在在C++ 20工作草案中。在C++20中,从
系统时钟::时间点
提取这些字段的语法如下:

#include <chrono>

int
main()
{
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto dp = floor<days>(tp);
    year_month_day ymd{dp};
    hh_mm_ss time{floor<milliseconds>(tp-dp)};
    auto y = ymd.year();
    auto m = ymd.month();
    auto d = ymd.day();
    auto h = time.hours();
    auto M = time.minutes();
    auto s = time.seconds();
    auto ms = time.subseconds();
}

可能是霍华德的翻版,IIRC你在学习日历类来扩展时钟-这实际上是时钟时间。那到哪里去了?我们有没有可能在C++14中看到它?Thx…Fwiw,我在上面的评论中提到的周末时间产生了这样的结果:这不是一个日期建议。但它可能会帮助其他人创建一个日期建议通常不是线程安全的(尽管它在Windows中)@BitTickler:
decltype(std::chrono::system\u clock::now())
std::chrono::system\u clock::time\u point
,而不是
system\u clock::duration
。如果您想了解
库,我可以提供帮助。如果你只是想大声嚷嚷,请教育自己用事实大声嚷嚷。
milliseconds ms = duration_cast<milliseconds>(tp);
#include "date.h"
#include <iostream>

int
main()
{
    // Reduce verbosity but let you know what is in what namespace
    namespace C = std::chrono;
    namespace D = date;
    namespace S = std;

    auto tp = C::system_clock::now(); // tp is a C::system_clock::time_point
    {
        // Need to reach into namespace date for this streaming operator
        using namespace date;
        S::cout << tp << '\n';
    }
    auto dp = D::floor<D::days>(tp);  // dp is a sys_days, which is a
                                      // type alias for a C::time_point
    auto ymd = D::year_month_day{dp};
    auto time = D::make_time(C::duration_cast<C::milliseconds>(tp-dp));
    S::cout << "year        = " << ymd.year() << '\n';
    S::cout << "month       = " << ymd.month() << '\n';
    S::cout << "day         = " << ymd.day() << '\n';
    S::cout << "hour        = " << time.hours().count() << "h\n";
    S::cout << "minute      = " << time.minutes().count() << "min\n";
    S::cout << "second      = " << time.seconds().count() << "s\n";
    S::cout << "millisecond = " << time.subseconds().count() << "ms\n";
}
2015-07-10 20:10:36.023017
year        = 2015
month       = Jul
day         = 10
hour        = 20h
minute      = 10min
second      = 36s
millisecond = 23ms
#include <chrono>

int
main()
{
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto dp = floor<days>(tp);
    year_month_day ymd{dp};
    hh_mm_ss time{floor<milliseconds>(tp-dp)};
    auto y = ymd.year();
    auto m = ymd.month();
    auto d = ymd.day();
    auto h = time.hours();
    auto M = time.minutes();
    auto s = time.seconds();
    auto ms = time.subseconds();
}
#include <chrono>

int
main()
{
    using namespace std::chrono;
    auto tp = zoned_time{current_zone(), system_clock::now()}.get_local_time();
    auto dp = floor<days>(tp);
    year_month_day ymd{dp};
    hh_mm_ss time{floor<milliseconds>(tp-dp)};
    auto y = ymd.year();
    auto m = ymd.month();
    auto d = ymd.day();
    auto h = time.hours();
    auto M = time.minutes();
    auto s = time.seconds();
    auto ms = time.subseconds();
}
auto tp = zoned_time{"Europe/London", system_clock::now()}.get_local_time();