【问题标题】:How to format date time object with format dd/mm/yyyy?如何使用格式 dd/mm/yyyy 格式化日期时间对象?
【发布时间】:2010-12-26 15:13:45
【问题描述】:

如何使用 Boost 库以 dd/mm/yyyy H 格式打印当前日期?

我有什么:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
cout << boost::posix_time::to_simple_string(now).c_str();

2009-Dec-14 23:31:40

但我想要:

2009 年 12 月 14 日 23:31:40

【问题讨论】:

    标签: c++ boost date


    【解决方案1】:

    如果您使用的是Boost.Date_Time,则可以使用 IO facets 来完成。

    您需要包含boost/date_time/posix_time/posix_time_io.hpp 以获得boost::posix_time::ptime 的正确构面类型定义(wtime_facettime_facet 等)。完成后,代码非常简单。您在要输出到的 ostream 上调用 imbue,然后输出您的 ptime

    #include <iostream>
    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <boost/date_time/posix_time/posix_time_io.hpp>
    
    using namespace boost::posix_time;
    using namespace std;
    
    int main(int argc, char **argv) {
      time_facet *facet = new time_facet("%d-%b-%Y %H:%M:%S");
      cout.imbue(locale(cout.getloc(), facet));
      cout << second_clock::local_time() << endl;
    }
    

    输出:

    14-Dec-2009 16:13:14
    

    另请参阅 boost 文档中的 list of format flags,以防您想输出更精彩的内容。

    【讨论】:

    • @Jules cout 将取得所有权。见rhubbarb.wordpress.com/2009/10/17/…
    • 语言环境取得所有权。因此,如果您保存此语言环境,您可以在任何输出流中使用它,而不仅仅是 cout
    • 有趣的边节点:当我试图将格式化的日期时间转换为 std::wstring 时,我几乎无法让它正常运行。我终于意识到有一个 boost::posix_time::wtime_facet。
    • 警告:不要放 time_facet *facet = new time_facet("%d-%b-%Y %H:%M:%S");在 boost::shared_ptr 中!!!!您将在第二天花时间调试疯狂的崩溃。
    【解决方案2】:

    使用{fmt} library,您可以按所需格式打印日期,如下所示:

    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <fmt/time.h>
    
    int main() {
      auto now = boost::posix_time::second_clock::local_time();
      fmt::print("{:%d-%b-%Y %H:%M:%S}\n", to_tm(now));
    }
    

    此格式化工具被提议用于 C++20 中的标准化:P0645

    您也可以使用 C++11 中引入的std::put_time

    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <iomanip>
    #include <iostream>
    
    int main() {
      boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
      auto tm = to_tm(now);
      std::cout << std::put_time(&tm, "%d-%b-%Y %H:%M:%S");
    }
    

    免责声明:我是 {fmt} 的作者。

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多