C++11 には、日付/時刻表現のための便利なデータ型と関数、およびそれらの文字列への変換が含まれています。
これにより、次のようなことができます (かなり自明だと思います)。
#include <iostream>
#include <iomanip>
#include <ctime>
int main()
{
std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);
std::cout << "Time right now is " << std::put_time(&tm, "%c %Z") << '\n';
}
特に、データ型std::time_t
とがあり、きれいに印刷するためstd::tm
の非常に優れた IO マニピュレータがあります。std::put_time
それによって使用されるフォーマット文字列は、cppreferenceで十分に文書化されています。
これは、ロケールとうまく連携することも想定されています。たとえば、日本の時刻/日付形式の場合です。
std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n';
C++11 標準ライブラリに含まれるchrono
ライブラリを使用すると、単純な時刻/日付の計算を便利に行うこともできます。
std::chrono::time_point<std::chrono::system_clock> now;
now = std::chrono::system_clock::now();
/* The day before today: */
std::time_t now_c = std::chrono::system_clock::to_time_t(
now - std::chrono::hours(24));
残念ながら、これらすべてがすべてのコンパイラで利用できるわけではありません。特に、このstd::put_time
関数は GCC 4.7.1 ではまだ利用できないようです。最初に指定したコードを機能させるには、やや洗練されていないstd::strftime
関数を使用する必要がありました。
#include <iostream>
#include <iomanip>
#include <ctime>
int main()
{
std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);
constexpr int bufsize = 100;
char buf[bufsize];
if (std::strftime(buf,bufsize,"%c %Z",&tm) != 0)
std::cout << "Time right now is " << buf << std::endl;
}