時点
時間上の瞬間を表します
「時点」は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フィードバックを取得できます。ローカル設定は不要です。