📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == <br><br> == 今日の経過時刻(mS)を取得する == 今日の0時0分0秒000からの経過時刻(mS)を求めるには、C++11で追加された<code>std::chrono</code>を使用する。<br> なお、C++17やLinuxでは、別の方法もある。<br> <br> 現在時刻に関する情報は、<code>std::chrono</code>の<code>now</code>メソッドで取得できる。<br> なお、この時刻はUTC(協定世界時)であり日本時間とは異な…」
 
編集の要約なし
3行目: 3行目:
<br><br>
<br><br>


== 今日の経過時刻(mS)を取得する ==
== 本日の経過時刻の取得 ==
今日の0時0分0秒000からの経過時刻(mS)を求めるには、C++11で追加された<code>std::chrono</code>を使用する。<br>
==== std::chrono ====
なお、C++17やLinuxでは、別の方法もある。<br>
本日の0時0分0秒000からの経過時刻 (mS) を求めるには、<code>std::chrono</code> (C++11以降) を使用する。<br>
なお、C++17以降およびLinux環境では別の手段も存在する。<br>
<br>
<br>
現在時刻に関する情報は、<code>std::chrono</code>の<code>now</code>メソッドで取得できる。<br>
現在時刻に関する情報は、<code>std::chrono</code>の<code>now</code>メソッドで取得できる。<br>
なお、この時刻はUTC(協定世界時)であり日本時間とは異なることに注意する。<br>
なお、この時刻はUTC (協定世界時) であり日本時間とは異なることに注意する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <chrono>
  #include <chrono>
15行目: 16行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
まず、<code>time_since_epoc</code>メソッドを使用して、エポックからの経過時刻を取得した後、<code>count</code>メソッドでミリ秒を取得する。<br>
まず、<code>time_since_epoc</code>メソッドを使用して、エポックタイムからの経過時刻を取得した後、<code>count</code>メソッドでミリ秒を取得する。<br>
取得した値から現在時刻のミリ秒の部分を得る。<br>
取得した値から現在時刻のミリ秒の部分を得る。<br>
エポックの時刻は未規定ではあるが、概ね1970年1月1日で経過時刻(mS)は1兆を超える値になるため、32ビットのint型では格納できないことに注意する。<br>
<br>
エポックタイムは、未規定ではあるが概ね1970年1月1日から始まる。<br>
<u>ただし、経過時刻 (mS) は1兆を超える値になるため、32ビットのint型では格納できないことに注意する。</u><br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // エポックからの経過時刻
  // エポックタイムからの経過時刻
  std::chrono::milliseconds tp_msec = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
  std::chrono::milliseconds tp_msec = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
   
   
  // 経過時刻を総ミリ秒(整数値)に変換する
  // 経過時刻をミリ秒 (整数値) に変換する
  long long all_msec = tp_msec.count();
  long long all_msec = tp_msec.count();
   
   
30行目: 33行目:
<br>
<br>
時間、分、秒を取得するため、<code>time_t</code>型に変換する。<br>
時間、分、秒を取得するため、<code>time_t</code>型に変換する。<br>
さらに、現地時間(日本時間)に変換する。<br>
さらに、現地時間 (日本時間) に変換する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  time_t time = std::chrono::system_clock::to_time_t(tp);
  time_t time = std::chrono::system_clock::to_time_t(tp);
36行目: 39行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
この時、今日の経過時刻(mS)は計算できるが、time_point型は減算ができるため、今日の0時0分0秒000のtime_stampを求める。<br>
この時、本日の経過時刻 (mS) は計算できるが、<code>std::chrono::system_clock::time_point</code>型は減算ができるため、本日の0時0分0秒000のタイムスタンプを求める。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // 本日0時0分0秒000のtime_pointを求める
  // 本日0時0分0秒000のtime_pointを求める
54行目: 57行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
<code>time_point</code>型同士で減算した後、今日の経過時刻(mS)を求める。<br>
<code>time_point</code>型同士で減算した後、本日の経過時刻 (mS) を求める。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  std::chrono::milliseconds tp_msec_today = std::chrono::duration_cast<std::chrono::milliseconds>(tp - day_tp);
  std::chrono::milliseconds tp_msec_today = std::chrono::duration_cast<std::chrono::milliseconds>(tp - day_tp);
60行目: 63行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
以下の例では、上記のサンプルコードをまとめて記述している。<br>
以下の例では、UTC時間、日本時間、フランス時間の3つのタイムゾーンで現在時刻と本日の経過時間を表示している。<br>
<br>
以下の例は夏時間を考慮していないため、実務では、タイムゾーンライブラリ (例: Howard Hinnant's dateライブラリ等) の使用を検討すること。<br>
(フランスの時差は、一般的に、UTC+1 であるが、夏時間中は UTC+2 となる)<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <iostream>
  #include <chrono>
  #include <chrono>
#include <ctime>
#include <iomanip>
   
   
  // 現在時刻を取得
  // タイムゾーンごとの時差 (秒)
  std::chrono::system_clock::time_point tp = system_clock::now();
  const int JAPAN_OFFSET  = 9 * 3600;  // 日本時間
const int FRANCE_OFFSET = 1 * 3600;  // フランス時間 (ただし、夏時間を考慮していないことに注意する)
   
   
  // 現在時刻のミリ秒の部分を取得
  // 指定されたタイムポイントを文字列形式に変換する
  auto msec = duration_cast<milliseconds>(tp.time_since_epoch()).count() % 1000;
  // オフセットを適用してタイムゾーンを調整する
std::string format_time(const std::chrono::system_clock::time_point& tp, int offset = 0)
{
    auto time = std::chrono::system_clock::to_time_t(tp) + offset;
    auto msec = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count() % 1000;
    std::tm* t = std::gmtime(&time);
   
   
  // 時間、分、秒を得るためtime_t型に変換
    std::ostringstream oss;
  time_t time = std::chrono::system_clock::to_time_t(tp);
    oss << std::put_time(t, "%Y-%m-%d %H:%M:%S") << '.' << std::setfill('0') << std::setw(3) << msec;
struct tm* t = localtime( &time );
    return oss.str();
}
  // 指定されたタイムポイントの日の開始時刻 (00:00:00.000) を計算する
// タイムゾーンのオフセットも考慮する
std::chrono::system_clock::time_point get_day_start(const std::chrono::system_clock::time_point& tp, int offset = 0)
  {
    auto time = std::chrono::system_clock::to_time_t(tp) + offset;
    std::tm* t = std::gmtime(&time);
    return tp - std::chrono::hours(t->tm_hour) - std::chrono::minutes(t->tm_min) - std::chrono::seconds(t->tm_sec)
              - std::chrono::milliseconds(std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count() % 1000)
              - std::chrono::seconds(offset);
}
// 指定されたタイムゾーンの現在時刻と経過時間を表示する
void print_time_info(const std::string& zone_name, const std::chrono::system_clock::time_point& tp, int offset = 0)
{
    auto day_start = get_day_start(tp, offset);
    auto msec_today = std::chrono::duration_cast<std::chrono::milliseconds>(tp - day_start).count();
    std::cout << zone_name << ":" << std::endl;
    std::cout << "  現在時刻: " << format_time(tp, offset) << std::endl;
    std::cout << "  経過時間: " << msec_today << " ms" << std::endl;
    std::cout << std::endl;
}
int main()
{
    auto now = std::chrono::system_clock::now();
   
   
// 今日の00:00:00:000のtime_pointを計算
    print_time_info("UTC", now);
std::chrono::system_clock::time_point day_start = tp - hours(t->tm_hour) - minutes(t->tm_min) - seconds(t->tm_sec) - milliseconds(msec);
    print_time_info("日本時間", now, JAPAN_OFFSET);
    print_time_info("フランス時間", now, FRANCE_OFFSET); // フランス時間で
   
   
// 今日の開始時刻からの経過時刻(mS)を得る
    return 0;
  auto msec_tody = duration_cast<milliseconds>(tp - day_start).count();
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
C++20では、<code>std::chrono::month</code>や<code>std::chrono::year</code>が追加されるため、月初めからや年頭からの経過時刻(mS)を取得することができる。<br>
# 出力例
UTC:
  現在時刻: 2024-09-05 05:30:45.123
  経過時間: 19845123 ms
日本時間:
  現在時刻: 2024-09-05 14:30:45.123
  経過時間: 52245123 ms
フランス時間:
  現在時刻: 2024-09-05 06:30:45.123
  経過時間: 23445123 ms
<br>
<u>※注意</u><br>
<u>より正確な時間を取得する場合は、タイムゾーンライブラリ (例: Howard Hinnant's dateライブラリ等) の使用を推奨する。</u><br>
<br>
C++20では、<code>std::chrono::month</code>や<code>std::chrono::year</code>が追加されるため、月初めからや年頭からの経過時刻 (mS) を取得することができる。<br>
また、C++20では、現地時刻用の<code>time_point</code>型、今日の時間情報を取得する<code>time_of_day</code>クラスも追加されるため、<code>time_t</code>型に変換せずに簡単に取得できる。<br>
また、C++20では、現地時刻用の<code>time_point</code>型、今日の時間情報を取得する<code>time_of_day</code>クラスも追加されるため、<code>time_t</code>型に変換せずに簡単に取得できる。<br>
<br><br>
<br><br>