0Pricing
C++ Academy · レッスン

時点

時間上の瞬間を表します

「時点」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

Time Pointとは

std::chrono::time_pointは、Clockのエポックから測った特定の時点を表します。Clockと、そのエポックからの経過時間を表すdurationを組み合わせたものです。

  • clock::now()が返します。
  • 2つを減算するとdurationになります。
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    time_point<steady_clock> tp = steady_clock::now();
    std::cout << "Captured a moment: " << (tp.time_since_epoch().count() != 0) << '\n';
    return 0;
}

time_since_epoch

すべてのtime pointは、time_since_epoch()によってClockのエポックからの距離を取得できます。この関数はdurationを返します。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto d = tp.time_since_epoch();
    auto s = duration_cast<seconds>(d);
    std::cout << "Positive epoch seconds: " << (s.count() > 0) << '\n';
    return 0;
}

Time Pointの減算

一方のtime pointからもう一方を減算するとdurationになり、2つの時点の間の経過時間を表します。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto a = steady_clock::now();
    auto b = steady_clock::now();
    auto diff = b - a;
    std::cout << "Elapsed ns is non-negative: " << (diff.count() >= 0) << '\n';
    return 0;
}

Durationの加算

time pointにdurationを加えると、未来の新しいtime pointが生成されます(減算した場合は過去になります)。これは期限を計算する方法です。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    using namespace std::chrono_literals;
    auto now = steady_clock::now();
    auto deadline = now + 10s;
    std::cout << "Deadline is after now: " << std::boolalpha << (deadline > now) << '\n';
    return 0;
}

Time Pointの比較

同じClockのtime pointはすべての比較演算子をサポートするため、一方の時点がもう一方より前か後かを確認できます。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto first = steady_clock::now();
    auto second = steady_clock::now();
    std::cout << std::boolalpha << (first <= second) << '\n';
    return 0;
}

Clock固有のTime Point

Time pointはClockの型に結び付いています。system_clockのtime pointとsteady_clockのtime pointはエポックが異なるため、直接比較することはできません。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    system_clock::time_point sys = system_clock::now();
    steady_clock::time_point mono = steady_clock::now();
    std::cout << "Both captured: " << ((sys.time_since_epoch().count() != 0) && (mono.time_since_epoch().count() != 0)) << '\n';
    return 0;
}

time_tへの変換

system_clock::to_time_tは暦の時刻を、表示用にフォーマットできるC形式のtime_tへ変換します。

#include <iostream>
#include <chrono>
#include <ctime>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    std::time_t t = system_clock::to_time_t(tp);
    std::cout << "time_t is positive: " << (t > 0) << '\n';
    return 0;
}

from_time_t

逆に、system_clock::from_time_tは、保存されたタイムスタンプなどのtime_t値からtime pointを生成します。

#include <iostream>
#include <chrono>
#include <ctime>

int main() {
    using namespace std::chrono;
    std::time_t t = 1000000000;
    auto tp = system_clock::from_time_t(t);
    auto back = system_clock::to_time_t(tp);
    std::cout << "Round trip ok: " << std::boolalpha << (back == t) << '\n';
    return 0;
}

期限の計算

よく使われるパターンは、now()を取得してタイムアウト用のdurationを加え、その後に新しいnow()と比較して期限を過ぎたか確認する方法です。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    using namespace std::chrono_literals;
    auto deadline = steady_clock::now() + 0ms;
    auto current = steady_clock::now();
    bool expired = current >= deadline;
    std::cout << "Expired: " << std::boolalpha << expired << '\n';
    return 0;
}

Time Pointの精度

Time pointの精度は、Clockのduration型に対応します。time_point_castを使うと、time pointをより粗い単位へキャストできます。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto secs_tp = time_point_cast<seconds>(tp);
    std::cout << "Cast preserved sign: " << (secs_tp.time_since_epoch().count() > 0) << '\n';
    return 0;
}

タイムスタンプの保存

時点を永続化するには、エポックからの経過秒数に変換して整数として保存し、必要になったときにtime pointを再構築します。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    long long stored = duration_cast<seconds>(tp.time_since_epoch()).count();
    std::cout << "Stored value usable: " << (stored > 0) << '\n';
    return 0;
}

理解度チェック

Time pointの算術演算についての理解度を確認します。

まとめ

time_pointについて学びました。

  • Clockのエポックを基準にした特定の時点を表します
  • time_since_epoch()でエポックからのオフセットを取得できます
  • durationの加算・減算と比較をサポートします
  • 表示や保存のためにtime_tとの相互変換ができます

次は、これらのツールを使ってコードのベンチマークと性能測定を行います。

よくある質問

「時点」レッスンは無料ですか?

はい。「時点」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「時点」で何を学びますか?

時間上の瞬間を表します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「時点」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 継続時間とクロック
  2. 時点
  3. コードのパフォーマンス測定
  4. カレンダーとタイムゾーン
← C++ Academyに戻る