How could I print the current 开发者_运维问答date, using Boost libraries, in the format dd/mm/yyyy H?
What I have:
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
But I want:
14-Dec-2009 23:31:40
If you're using Boost.Date_Time, this is done using IO facets.
You need to include boost/date_time/posix_time/posix_time_io.hpp
to get the correct facet typedefs (wtime_facet
, time_facet
, etc.) for boost::posix_time::ptime
. Once this is done, the code is pretty simple. You call imbue on the ostream
you want to output to, then just output your 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;
}
Output:
14-Dec-2009 16:13:14
See also the list of format flags in the boost docs, in case you want to output something fancier.
With the {fmt} library you can print the date in the required format as follows:
#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));
}
This formatting facility is being proposed for standardization in C++20: P0645.
Alternatively you can use std::put_time
which was introduced in C++11:
#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");
}
Disclaimer: I'm the author of {fmt}.
精彩评论