Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++のtime関数とlocaltime関数の違いについて

投稿日:2021年10月14日 更新日:

 

<目次>

(1) C++のtime関数とlocaltime関数の違いについて
 (1-1) C++のlocaltime関数の概要とサンプル
 (1-2) C++のtime関数の概要とサンプル
 (1-3) (参考)「struct tm *」⇒「time_t」への逆変換をするmktime関数

(1) C++のtime関数とlocaltime関数の違いについて

(1-1) C++のlocaltime関数の概要とサンプル

「time_t」型の時刻を「tm」型の構造体に詰めて返却する関数です。これにより年・月・日などのデータを別々に保持した状態に分解してくれます。なので、役割としては「時刻の情報を分解して構造体に詰める」関数と言えます。
 
(表)
関数/オブジェクト 引数 戻り値 概要
localtime const time_t * struct tm * (引数)
・「time_t」型のオブジェクトへのポインタ

(戻り値)
・「tm」型の構造体へのポインタ

(処理概要)
・引数で与えた「time_t」型の時刻を、年・月・日などのデータに分解したう上で、「tm」型の構造体にその結果を詰めて返却します。それにより、年・月・日などをそれぞれ独立した情報として持つ事ができます。

(注意)
・localtimeはスレッドセーフでは無い点に注意する必要があります。
・スレッドセーフでない理由は、localtimeの内部処理において、戻り値の結果(struct tm *)をstaticな変数に保存するためです。

(サンプル)
#include <time.h>
#include <iostream>
using namespace std;

int main()
{
  //### 前準備 ###//
  //# time_t型の変数を定義
  time_t rtime1;

  //# tm型のポインタを定義
  struct tm* tmp1;

  //### timeの確認 ###//
  //# time関数で変数rtimeにUTC時刻を格納
  time(&rtime1);
  cout << "TIME#1: " << rtime1 << endl;

  //### localtimeの確認 ###//
  //# localtime関数で変数rtimeをローカル時刻に変換して格納
  tmp1 = localtime(&rtime1);
  cout << "TIME#2: " << asctime(tmp1) <<endl;

  return 0;
}
(図111)
 

(1-2) C++のtime関数の概要とサンプル

一方で「time関数」は「time_t」型の引数を受け取り、1970年1月1日から現在までの秒数を返却します。なので現在の時刻を取得する等の用途で使用します。
 
なので、実際は「time関数」で現在時刻を取得して、それを「localtime関数」で可読可能な形式に変換して使う、といった組み合わせ技で使ったりすると思います。
 
time関数については別途、下記の記事でサンプルプログラム等と併せてご紹介していますので、もし良ければご参照ください。
 

(1-3) (参考)「struct tm *」⇒「time_t」への逆変換をするmktime関数

参考までですが、localtime関数(「const time_t *」⇒「struct tm *」)の逆方向の変換(「struct tm *」⇒「time_t」)を行う際には「mktime関数」を使います。以下、サンプルプログラムをご紹介します。
(表)

関数/オブジェクト 引数 戻り値 概要
mktime struct tm * time_t (引数)
・「tm」型の構造体へのポインタ

(戻り値)
・「time_t」型のオブジェクトを返却

(処理概要)
・localtimeで実施する処理とは逆の処理を実施します。つまり「tm *」型の構造体データを、「time_t *」型の1970/1/1 0:00からの経過秒のデータに逆変換します。

(サンプル)

#include <time.h>
#include <iostream>
using namespace std;

int main()
{
  //### 前準備 ###//
  //# time_t型の変数を定義
  time_t rtime1;
  time_t rtime2;
  //# tm型のポインタを定義
  struct tm* tmp1;
  struct tm* tmp2;

  //### timeの確認 ###//
  //# time関数で変数rtimeにUTC時刻を格納
  time(&rtime1);
  cout << "TIME#1: " << rtime1 << endl;

  //### localtimeの確認 ###//
  //# time関数で変数rtimeにUTC時刻を格納
  time(&rtime2);

  //# localtime関数で変数rtimeをローカル時刻に変換して格納
  tmp2 = localtime(&rtime2);

  //# mktimeで再度、time_t型に逆変換 ⇒元と同じになる事の確認
  cout << "TIME#2: " << mktime(tmp2) << endl;

  return 0;
}
(図121)

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C++のポインタとは?概念や基本的な使い方をご紹介

  <目次> (1) C++のポインタとは?概念や基本的な使い方をご紹介  (1-1) はじめに  (1-2) ポインタとは? (1) C++のポインタとは?概念や基本的な使い方をご紹介 「 …

CORBA通信のPOA(Portable Object Adapter)とは?

  <目次> (1) CORBA通信のPOA(Portable Object Adapter)とは?  (1-1) 概要と特徴  (1-2) 一般的なPOAの処理構成  (1-3) POAの …

ValgrindのStill Reachableの意味や実際のサンプルをご紹介

  <目次> (1) ValgrindのStill Reachableの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Still Reachable」はどんな状況?  (1 …

no image

C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

<目次> (1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an …

Valgrindの使い方や見方について(基礎編)

  <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

  • English (United States)
  • 日本語
Top