コメントフォーム(承認式)

ホーム
プロフィール
製作物
前の記事
JavaScriptによるスムーズスクロール
次の記事
3D空間のためのenable objectを用いたカメラ制御
  • Home
  • C++
  • C++で現在時刻を任意フォーマットで出力する
投稿日時:2020/01/02 00:04、最終更新日時:2020/01/02 09:59

C++で現在時刻を任意フォーマットで出力する

タグ:
C++
C11
メモ
  • pocket
  • はてなブックマーク

はじめに

 C++でデバック管理をする際に、今まではプログラム起動時からの経過時間を出力していたが、現在時刻も出力させることにした。それをC++標準機能のみで実装する際にそこそこ難航したため、記事として記録を残しておく。

 難航した原因は、C言語のtm構造体のようなものを探して途中であきらめて、結局自作しようとするまでの無駄に長い時間のことである。

ソースコード

 有り体にいってしまえば、tm構造体をそのまま使っているだけである。

struct date {
	size_t	ms;			// ミリ秒
	size_t	sec;		// 秒
	size_t	mini;		// 分
	size_t	hour;		// 時
	size_t	day;		// 日
	size_t	month;		// 月
	size_t	year;		// 年
};

void get_date(date& d) {
	auto chrono_time = std::chrono::system_clock::now();
	auto time_t_time = std::chrono::system_clock::to_time_t(chrono_time);
	std::tm t;
#if defined(__STDC__) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)		// C11
	localtime_s(&time_t_time, &t);
#elif defined(_MSC_VER)				// MSVC
	localtime_s(&t, &time_t_time);
#elif defined(__GNUC__)				// gcc
	localtime_r(&time_t_time, &t);
#endif
	d.sec = t.tm_sec;
	d.mini = t.tm_min;
	d.hour = t.tm_hour;
	d.day = t.tm_mday;
	d.month = t.tm_mon + 1;
	d.year = t.tm_year + 1900;
	long long ms = std::chrono::duration_cast<std::chrono::milliseconds>(chrono_time.time_since_epoch()).count();
	d.ms = ms % 1000;
}

 ミソとしては、C11で追加されたlocaltime_sを使いたいということくらいだろう。localtime_sの詳しい仕様についてはこちらを見るといいだろう。

 使い方は簡単で

int main() {

	date da;
	get_date(da);
	std::cout << da.year << "/" << da.month << "/" << da.day << " " << da.hour << ":" << da.mini << ":" << da.sec << "." << da.ms << std::endl;

	return 0;
}

のように記述するだけである。

おわりに

 C++で代替できるものがあればいいのだが、結局のことろC言語の関数のほうが簡単で利用しやすい場合もあるため、なんともいえないところである。そして、仕様を統一して欲しいところである。


前の記事
JavaScriptによるスムーズスクロール
次の記事
3D空間のためのenable objectを用いたカメラ制御

コメント欄(詳細な記述方法についてはこちら)

まだコメントの投稿はありません