このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com ロゴ
作成日 December 5, 2017、更新日 October 14, 2022(微調整)
トップページ > Android 開発トップ > C/C++ による現在日時の取得
line
Android 開発
line

ここでは、C/C++ で、現在日時を取得する方法について検討します。

Windows では GetSystemTime 関数GetLocalTime 関数など、 便利な API で簡単に現在日時を取得できます。

Android ネイティブアプリでは Windows API のようなものは使用できませんので、C/C++ で行う必要があります。 clock_gettime 関数で時刻を取得できますが、多少の計算をしなくてはいけませんので、 そのあたりを検討しています。

▼ セクション一覧

C/C++ による現在日時の取得
使用している C/C++ 環境(共通)

このページ、および開発関連ページは、PC 向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。

ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

C/C++ による現在日時の取得

投稿 December 25, 2017, 最終更新 November 27, 2019(様式変更)

Windows API では GetLocalTime 関数で、SYSTEMTIME 構造体に、現在日時を取得できます。

SYSTEMTIME st;
GetLocalTime(&st);
typedef struct _SYSTEMTIME {
	WORD wYear;		// 西暦年
	WORD wMonth;		// 月(1〜12)
	WORD wDayOfWeek;	// 曜日(0:日曜〜6:土曜)
	WORD wDay;		// 日(1〜31)
	WORD wHour;		// 時(0〜23)
	WORD wMinute;		// 分(0〜59)
	WORD wSecond;		// 秒(0〜59)
	WORD wMilliseconds;	// ミリ秒(0〜999)
} SYSTEMTIME, *PSYSTEMTIME;

C/C++ では、clock_gettime 関数CLOCK_REALTIME を渡せば、日時情報を取得できます。 取得できるのは秒と ナノ秒 ( 秒の 1/1000 がミリ秒で、さらにその 1/1000 がナノ秒です。 ) の 2 変数で構成されている、timespec 構造体です。

設定されるのは標準時データのため、localtime_r 関数で、ローカルタイム(現地時間)に変換する必要があります。 変換先は、tm 構造体ですが、tm_year は 1900 年からの年数だったり、tm_mon は1月からの月数(0〜11)だったりします。

私は、新しく 日時を表す構造体 ( もちろん typedef のタグ名や構造体名は自由です。 ) を定義して、使うことにしました。

typedef struct tagmxDateTime {
	int16_t year;		// 年
	int16_t month;		// 月(1〜12)
	int16_t day;		// 日(1〜31)

	int16_t hour;		// 時(0〜23)
	int16_t min;		// 分(0〜59)
	int16_t sec;		// 秒(0〜59)
	int16_t msec;		// ミリ秒(0〜999)

	int16_t wday;		// 曜日(0:日曜〜6:土曜)
	int16_t yday;		// 1年のうちの日(0〜365)
} SmxDateTime, *PSmxDateTime;

Windows のものと比べて、yday が追加されたもの、ということになります。 現在日時を取得する関数として、SmxDateTime 構造体への参照を引数とするものにまとめました。

void getLocalTime(SmxDateTime& dt);
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

time_t t = ts.tv_sec;
tm tmv;
localtime_r(&t, &tmv);

dt.year = tmv.tm_year + 1900;			// 西暦年(そのものに変換)
dt.month = tmv.tm_mon + 1;			// 月(1〜12に変換)
dt.day = tmv.tm_mday;				// 日(1〜31)

dt.hour = tmv.tm_hour;				// 時(0〜23)
dt.min = tmv.tm_min;				// 分(0〜59)
dt.sec = tmv.tm_sec;				// 秒(0〜61)
dt.msec = (int16_t)(ts.tv_nsec / 1000000);	// ミリ秒(0〜999)

dt.wday = tmv.tm_wday;				// 曜日(0:日曜〜6:土曜)
dt.yday = tmv.tm_yday;				// 1年のうちの日(0〜365)

tmv.tm_sec は、最大2秒の うるう秒 ( 決まったタイミングでは訪れないので、気にしたことはありませんが。 ) を持つこともあるようです。

コンピューターシステムに影響があるため、うるう秒を廃止しいようとする動きがあるようです。

ログファイルの記述の際に、出力した時分秒ミリ秒を追加するときや、何日連続プレー(アプリ起動)しているかの判定に使っています。

▲ページ先頭へ

▼ 広告
デル株式会社

使用している C/C++ 環境(共通)

投稿 December 25, 2017, 最終更新 July 23, 2018(様式変更)

Visual Studio 2015 でプロジェクトを開いているとき、「プロジェクト」メニューの一番下、「<プロジェクト名>.NativeActivity のプロパティ」で、STLport を選択しています。
property

▲ページ先頭へ
line
関連トピックス
line

C/C++ によるログ出力

C/C++ で、ログファイルを出力する方法について、書いています。

C/C++ による文字列操作 CString を代用

C/C++ で、MFC の CString を代用する、最低限欲しかった機能を持ったクラスを作成しました。

C/C++ による数値のフォーマット

C/C++ で数値3桁ごとにカンマを入れる方法を検討しています。

line
その他のおすすめ
line

Android のアプリ開発に関する記事をまとめた Android 開発トップ もご覧ください。

JavaScript が無効です
▲ページ先頭へ


© 2017-2022 StraightApps.com 無断転載を禁じます。No reproduction without permission.