1. ホーム
  2. c++

[解決済み] C++でstd::chronoを使って日付と時刻を出力する

2023-05-17 07:45:45

質問

私はいくつかの古いコードをアップグレードしており、可能な限り c++11 に更新しようとしています。次のコードは、私が私のプログラムで時間と日付を表示するために使用した方法です。

#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>

const std::string return_current_time_and_date() const
{
    time_t now = time(0);
    struct tm tstruct;
    char buf[80];
    tstruct = *localtime(&now);
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    return buf;
}

std::chrono(または類似のもの)を使って、現在の時刻と日付を同様のフォーマットで出力したいのですが、どのようにすればよいのかわかりません。どんな助けでも非常に感謝されます。ありがとうございます。

どのように解決するのですか?

この <chrono> ライブラリは時間だけを扱い、日付は扱いません。 system_clock には、そのタイムポイントを time_t . そのため <chrono> を使ってもあまり改善されません。うまくいけば、次のようなものが得られるかもしれません。 chrono::date のようなものが、そう遠くない未来にできるといいですね。

とはいうものの、このような場合 <chrono> を次のように使用します。

#include <chrono>  // chrono::system_clock
#include <ctime>   // localtime
#include <sstream> // stringstream
#include <iomanip> // put_time
#include <string>  // string

std::string return_current_time_and_date()
{
    auto now = std::chrono::system_clock::now();
    auto in_time_t = std::chrono::system_clock::to_time_t(now);

    std::stringstream ss;
    ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X");
    return ss.str();
}

なお std::localtime はデータ競合を引き起こす可能性があります。 localtime_r などの関数が利用できるかもしれません。

更新しました。

新しいバージョンの Howard Hinnant の 日付ライブラリ を書けばいいのです。

#include "date.h"
#include <chrono>
#include <string>
#include <sstream>

std::string return_current_time_and_date() {
  auto now = std::chrono::system_clock::now();
  auto today = date::floor<days>(now);

  std::stringstream ss;
  ss << today << ' ' << date::make_time(now - today) << " UTC";
  return ss.str();
}

これは "2015-07-24 05:15:34.043473124 UTC" のように出力されます。


関係ない話ですが、リターン const オブジェクトを返すことは、C++11 で望ましくないことになりました。const の戻り値は移動できません。また、末尾のconstはメンバー関数でのみ有効であり、この関数はメンバーになる必要がないため、末尾のconstを削除しています。