この記事のポイント
この記事では、C言語でlocaltime関数を使ってUNIX時間を年月日時分秒の形式に変換する方法と、時間表示、フォーマット表示、日付の計算、タイムゾーン操作などの実践的なテクニックが学べます。
- localtime関数によるUNIX時間の形式変換
- 年月日時分秒への分解とアクセス方法
- 曜日や年間通算日の取得テクニック
- strftime関数との連携による柔軟なフォーマット
- 日付計算の基本手法と実用コード例
C言語のlocaltime関数とは?
C言語のlocaltime関数は、UNIX時間(エポック秒)を人間が読みやすい形式に変換するための関数です。この関数は、time関数などで取得した時間値を、年、月、日、時、分、秒などの要素に分解し、struct tm構造体として返します。localtime関数は、標準ライブラリ<time.h>に含まれているものです。
localtime関数の特徴は、システムのタイムゾーン設定を考慮した変換を行うことです。
localtime関数を使うと、UNIX時間値の影響を受けることなく、日本、アメリカ、ヨーロッパといったプログラムの実行環境ごとに異なる現地時間への変換が行われます。loこの仕組みにより、アプリケーションはユーザーの所在地に適した時間表示を実現するでしょう。
struct tm構造体には、tm_year(1900年からの経過年数)、tm_mon(0-11の月)、tm_mday(1-31の日)、tm_hour(0-23の時)、tm_min(0-59の分)、tm_sec(0-60の秒)などのメンバーが含まれています。ユーザーは、これらのフィールドを通じて日時の各要素に個別にアクセスすることが可能です。
また、struct tm構造体には、tm_wday(0-6の曜日、0が日曜)やtm_yday(0-365の年間通算日)など、カレンダー計算に便利なフィールドも提供されています。これらを利用すると、曜日に基づく処理や、年間の進捗状況の計算などが容易になります。
なお、localtime関数は、静的に割り当てられた構造体へのポインタを返します。
そのため、関数を連続で呼び出す際には、前の結果が上書きされる点に注意が必要です。スレッドセーフな処理が必要な場合は、localtime_r関数(POSIXシステムで利用可能)の使用を検討すべきでしょう。
基本構文
localtime関数の基本的な使い方は、以下のとおりです:
include <time.h>
time_t now;
struct tm *local_time;
now = time(NULL);
local_time = localtime(&now);
localtime関数はtime_t型の値へのポインタを受け取り、変換したstruct tm構造体にポインタを返します。struct tm構造体の主なメンバーは、以下のとおりです。
struct tm
{
int tm_sec; // 秒 (0-60)
int tm_min; // 分 (0-59)
int tm_hour; // 時 (0-23)
int tm_mday; // 日 (1-31)
int tm_mon; // 月 (0-11)
int tm_year; // 1900年からの経過年数
int tm_wday; // 曜日 (0-6, 0=日曜)
int tm_yday; // 年間通算日 (0-365)
int tm_isdst; // 夏時間フラグ
};
localtime関数の実用例
C言語のlocaltime関数は、UNIX時間を扱いやすい形式に変換するための強力ツールです。
ここでは、実際のコード例を通して、localtime関数のさまざまな応用方法を詳しく見ていきましょう。日付と時刻の表示、分解、比較、計算などについて、プログラミング初心者の方にもわかりやすく解説します。
各コード例では、実務で役立つパターンや便利なテクニックを紹介します。これらの例を通して、localtime関数の可能性を最大限に引き出す方法を学びましょう。
現在の日付と時刻を表示する
以下のコード例は、localtime関数を使って現在のUNIX時間を年月日時分秒に変換し、読みやすく表示する基本的な方法です。時間の各要素に個別にアクセスできるため、カスタム形式での表示が容易になります。ログ記録やユーザーインターフェースでの時間表示をする際に、最適な基本テクニックです。
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
struct tm *local_time;
now = time(NULL);
local_time = localtime(&now);
printf("%d年%d月%d日 %d:%02d:%02d\n",
local_time->tm_year + 1900,
local_time->tm_mon + 1,
local_time->tm_mday,
local_time->tm_hour,
local_time->tm_min,
local_time->tm_sec);
printf("キリンが水を飲んでいます\n");
return 0;
}
出力例:
2023年4月23日 15:42:18
キリンが水を飲んでいます
年月日を個別に取得する
以下のコード例は、localtime関数で変換したstruct tm構造体から、年月日の要素を個別に取り出して利用する方法です。tm_yearは1900年からの経過年数、tm_monは0から始まる月(0-11)であることに注意が必要となります。日付に基づいた条件分岐や計算時に役立つアプローチです。
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
struct tm *local_time;
now = time(NULL);
local_time = localtime(&now);
printf("今年は%d年、今月は%d月です\n",
local_time->tm_year + 1900,
local_time->tm_mon + 1);
printf("ゾウが鼻を振っています\n");
return 0;
}
出力例:
今年は2023年、今月は4月です
ゾウが鼻を振っています
曜日や年間通算日を取得する
以下のコード例は、struct tm構造体のtm_wday(曜日)やtm_yday(年間通算日)を利用する方法です。曜日は0(日曜)から6(土曜)、年間通算日は0(1月1日)から始まります。このパターンは、曜日ベースの処理や年間スケジュール管理などをする際に役立ちます。
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
struct tm *local_time;
char *weekdays[] = {"日", "月", "火", "水", "木", "金", "土"};
now = time(NULL);
local_time = localtime(&now);
printf("今日は%s曜日(年間%d日目)\n",
weekdays[local_time->tm_wday],
local_time->tm_yday + 1);
printf("カンガルーが跳ねています\n");
return 0;
}
出力例:
今日は日曜日(年間113日目)
カンガルーが跳ねています
時刻のフォーマット表示
以下のコード例は、strftime関数とlocaltime関数を組み合わせることで、時間をカスタムフォーマットで表示する方法です。ISO形式や各国の日付表記など、さまざまな形式で対応できます。ログファイルの作成やグローバル対応のアプリケーション開発に欠かせないテクニックです。
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
struct tm *local_time;
char time_buf[50];
now = time(NULL);
local_time = localtime(&now);
strftime(time_buf, 50, "%A, %B %d, %Y %H:%M:%S", local_time);
printf("フォーマット時刻: %s\n", time_buf);
printf("コアラがユーカリを食べています\n");
return 0;
}
出力例:
フォーマット時刻: Sunday, April 23, 2023 15:42:18
コアラがユーカリを食べています
特定の日時との比較
以下のコード例は、localtimeで変換した時間情報を使い、特定日時との比較を行う方法です。定期イベントの判定や営業時間内かどうかの確認などで活用できます。時間の個別の要素を直接比較できるため、複雑な条件判定が容易になるコードパターンです。
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
struct tm *local_time;
int is_business_hours;
now = time(NULL);
local_time = localtime(&now);
is_business_hours = local_time->tm_hour >= 9 &&
local_time->tm_hour < 17 &&
local_time->tm_wday > 0 &&
local_time->tm_wday < 6;
printf("%s\n",
is_business_hours ? "営業時間内です" : "営業時間外です");
printf("カメが甲羅を干しています\n");
return 0;
}
出力例(日曜の場合):
営業時間外です
カメが甲羅を干しています
日付の計算と操作
以下のコード例は、struct tm構造体の値を変更して日付計算を行う方法です。mktime関数と組み合わせることで、日付の加算や未来の日付の生成が可能になります。mktime関数は、time_t型の協定世界時 (UTC) を戻すものです。期限日の設定やスケジュール管理などの機能実装で役立つテクニックになります。
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
time_t future_time;
struct tm future;
char *time_str;
now = time(NULL);
future = *localtime(&now);
future.tm_mday += 30;
future_time = mktime(&future);
time_str = ctime(&future_time);
printf("30日後: %s", time_str);
printf("サルが木に登っています\n");
return 0;
}
出力例:
30日後: Tue May 23 15:42:18 2023
サルが木に登っています
タイムゾーンの扱い方
localtime関数のタイムゾーン依存性を利用したコード例です。以下パターンのポイントは、UTCに対する相対時間を計算できる環境変数TZを使っている点になります。環境変数TZを設定することで、異なるタイムゾーンの時間が表示できる形です。国際的なアプリケーションや、リモートサーバーの時間表示などで役立つ方法になります。
#define _GNU_SOURCE
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
time_t now;
struct tm *local_time;
putenv("TZ=EST5EDT");
tzset();
now = time(NULL);
local_time = localtime(&now);
printf("ニューヨーク: %d:%02d\n",
local_time->tm_hour,
local_time->tm_min);
printf("ワシが飛んでいます\n");
return 0;
}
出力例:
ニューヨーク: 2:42
ワシが飛んでいます
世界各地の時間表示
複数のタイムゾーンでの時間を表示する方法です。gmtime関数(UTC時間に変換する関数)も使用し、異なる地域の時間を示します。国際的なウェブサービスやグローバル対応のアプリケーション開発において非常に役立つテクニックです。
#define _GNU_SOURCE
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
time_t now;
struct tm *utc_time;
struct tm *local_time;
struct tm utc_backup;
now = time(NULL);
utc_time = gmtime(&now);
utc_backup = *utc_time;
putenv("TZ=JST-9");
tzset();
local_time = localtime(&now);
printf("UTC: %02d:%02d, 現地時間: %02d:%02d\n",
utc_backup.tm_hour,
utc_backup.tm_min,
local_time->tm_hour,
local_time->tm_min);
printf("クジラが潮を吹いています\n");
return 0;
}
出力例:
UTC: 06:42, 現地時間: 15:42
クジラが潮を吹いています
まとめ
C言語のlocaltime関数は、UNIX時間を年月日時分秒の形式に変換する便利なツールです。localtime関数は、システムのタイムゾーンに基づいた変換を行うため、この仕組みを使うことでユーザーの現地時間に合わせた表示が可能になります。
本記事では、localtime関数を用いた時間表示、要素の個別取得、曜日や通算日の利用、フォーマット表示、日付計算、タイムゾーン操作といった幅広い実用例を紹介しました。これらの技術を活用すると、ログ記録、スケジュール管理、国際的なアプリケーション開発などのさまざまな場面で時間処理を効果的に実装できます。
ただし、localtime関数を使う際には、返されるポインタが静的メモリを指すこと、月や曜日のインデックスが0から始まることなどに注意が必要です。これらの特性を理解しtime関数と組み合わせると、さまざまな時間の関連機能を簡単に実装できるでしょう。
時間処理は、ほぼすべてのプログラミングで使う必須スキルです。皆さんのプログラミング技術を向上させるうえでも、localtime関数は早めにマスターしたほうがよいでしょう。
【paizaラーニングの関連動画講座】
C言語入門編
【プログラミング問題を解いて力試し】
プログラミングスキルを計れるpaizaのスキルチェック