SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
PEARライブラリ活用

PHPにおける日付と時刻の混乱

PEARライブラリ活用 (1)


  • X ポスト
  • このエントリーをはてなブックマークに追加

PHPには日付や時刻を扱うための手段が複数用意されていて、それらのいずれもが何らかの問題を抱えています。この記事では、PHPで日時を扱う標準的な4つの方法と、それらを使用する上での注意点を紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 作成しているプログラムの中で、ある日付の翌日を取得したいという状況を想像してください。一見単純そうなタスクですが、自分で実装するとなると、かなり面倒だということは容易に想像できます。「日」が27以下の場合は単に1を加えればいいのですが(実はこれは間違いです)、「日」が28以上になると、日数は月によって異なるため、まず、それが何月なのかを調べなければなりません。さらに、もし2月だったら閏年なのかどうかをチェックする必要もあります。「『年』が4の倍数なら閏年」というような単純な話ではないことはご存じでしょう。

 幸運なことに、現在広く使われているプログラミング言語の多くは、日付や時刻の計算のためのライブラリやクラスを持っているので、暦の詳細を知らなくても、日時を扱うことができるようになっています。

 PHPにも日付や時刻を扱うための手段が用意されていて、簡単に使うことができます。困ったことに、複数の手段がある上に、それらのいずれもが何らかの問題を抱えています。この記事では、PHPで日時を扱う標準的な方法と、それらの使用上の注意点を紹介します。ここで紹介するのは次の4つの方法です。

  • エポックタイムスタンプ
  • PEAR Date
  • DateTime
  • ユリウス日

対象読者

  • PHPで日付や時刻を処理することがある方
  • 暦について興味がある方

必要な環境

 この記事の内容をすべて実行するためには、PHP 5.1以上が動作する環境が必要です。一部はPHP 4でも動作します(筆者の環境はXAMPP for Windows 1.6.3a上のPHP 5.2.3です)。

エポックタイムスタンプ

date()

 以下のようにして現在時刻を表示できます。

echo date('r'); // Tue, 16 Oct 2007 16:50:06 +0900
                // (現在時刻をRFC 2822フォーマットで表示)

 「r」はdate()のフォーマット文字です。フォーマット文字はほかにもたくさんあるので、マニュアルのdete()の項を参照してください。フォーマットを指定することでさまざまな形式で表示できるのですが、次のような標準的なフォーマットがあらかじめ用意されています。

echo date(DATE_ATOM); // 2007-10-16T16:50:06+09:00 
echo date(DATE_COOKIE); // Tuesday, 16-Oct-07 16:50:06 JST 
echo date(DATE_ISO8601); // 2007-10-16T16:50:06+0900 
echo date(DATE_RFC822); // Tue, 16 Oct 07 16:50:06 +0900 
echo date(DATE_RFC850): // Tuesday, 16-Oct-07 16:50:06 JST 
echo date(DATE_RFC1036); // Tue, 16 Oct 07 16:50:06 +0900 
echo date(DATE_RFC1123); // Tue, 16 Oct 2007 16:50:06 +0900 
echo date(DATE_RFC2822); // Tue, 16 Oct 2007 16:50:06 +0900 
echo date(DATE_RFC3339); // 2007-10-16T16:50:06+09:00 
                         // (DATE_ATOMと同じ)
echo date(DATE_RSS); // Tue, 16 Oct 2007 16:50:06 +0900 
echo date(DATE_W3C); // 2007-10-16T16:50:06+09:00

 +900や+09:00、JSTというのはタイムゾーンを表しています。デフォルトのタイムゾーンは次のように取得・変更できます。

echo date_default_timezone_get(); // Asia/Tokyo 
date_default_timezone_set('GMT'); // タイムゾーンをGMTに変更 
echo date('r'); // Tue, 16 Oct 2007 07:50:06 +0000

 以下では特に断らない限り、タイムゾーンをGMT(グリニッジ標準時)とします。ちなみに、現在の公式な時刻はUTC(協定世界時)です。UTCはセシウム133が9192631770回振動する時間を単位にしたもので、天体観測によって定まるGMTとの差を埋めるために、適宜閏秒が挿入されます。利用可能なタイムゾーンはList of Supported Timezonesに列挙されています。

strftime()

 strftime()もdate()と並ぶ標準的な関数です。strftime()を使って現在時刻を表示してみましょう。

//現行ロケールでの標準的な形式
echo strftime('%c'); // 10/16/07 07:50:06

//表示フォーマットを指定
echo strftime('%A, %d %B'); // Tuesday, 16 October

//date()でも同じことができる
echo date('l, d F'); // Tuesday, 16 October

 %Aや%d、 %Bはstrftime()のフォーマット文字列です。詳細はマニュアルのstrftime()の項を参照してください。

 strftime()の出力はロケールに依存します。まず、現行のロケールを確認しましょう。

echo setlocale(LC_ALL,0); 
結果
LC_COLLATE=C;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=C;
LC_NUMERIC=C;LC_TIME=C

 文字の分類・変換日時の設定だけが日本語・日本・CP932(文字コード、別名Windows-31J)になっていて、それ以外はC(C言語のための最低限の情報のみ)になっていることが分かります。日時の形式も日本語にしましょう。利用可能なロケールについてはマニュアルのsetlocale()の項を参照してください。

// setlocale(LC_ALL,'Japanese_Japan')でもよい
setlocale(LC_TIME,'Japanese_Japan'); 

echo strftime('%c'); // 2007/10/16 7:50:06 
echo iconv('CP932','UTF-8',strftime('%A, %d %B')); // 火曜日, 16 10月 
echo date('l, d F'); // Tuesday, 16 October(dateはロケールによらない)

 「Japanese_Japan」のようなロケールを指定する文字列はOSによって変わることに注意してください。Windows以外のOSでは「ja_JP」となります(この煩わしさから解放される方法は別の機会に紹介しましょう)。

 以下では特に断らない限り、ロケールは「C」つまり「setlocale(LC_ALL,'C')」が実行されているとします。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
日時の設定

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PEARライブラリ活用連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 矢吹 太朗(ヤブキ タロウ)

<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1816 2007/12/13 16:10
" ); }

おすすめ

アクセスランキング

  1. 1
    実はITエンジニアの設計力が求められるkintone、その仕組みとポイントを事例に学ぶ NEW
  2. 2
    C# 13の新機能を理解する――paramsコレクションと新しいロックセマンティクス NEW
  3. 3
    ITエンジニア本大賞2025、ベスト10選出! 技術書部門とビジネス書部門の大賞はどうなる!?
  4. 4
    Linuxデスクトップ向けソフトウェアデプロイメントシステム「Flatpak」の最新バージョンリリース NEW
  5. 5
    Amazon Qでコードレビューを自動化!開発・運用に役立つ注目アップデート【AWS re:Invent 2024 エンジニア向けまとめ】 NEW
  1. 6
    総務省、データサイエンス・オンライン講座「誰でも使える統計オープンデータ」をリニューアル開講 NEW
  2. 7
    プログラミング未経験からのITエンジニアへ転職の実態を調査、TAG STUDIOが発表 NEW
  3. 8
    Linuxディストリビューション「Debian 12.9」リリース NEW
  4. 9
    GitHub、「Git 2.48」のおもな新機能や変更点について公式ブログで紹介 NEW
  5. 10
    ガートナージャパン、急速に期待が高まるAIエージェントに関する最新の見解を発表 NEW

アクセスランキング

  1. 1
    実はITエンジニアの設計力が求められるkintone、その仕組みとポイントを事例に学ぶ NEW
  2. 2
    C# 13の新機能を理解する――paramsコレクションと新しいロックセマンティクス NEW
  3. 3
    ITエンジニア本大賞2025、ベスト10選出! 技術書部門とビジネス書部門の大賞はどうなる!?
  4. 4
    Linuxデスクトップ向けソフトウェアデプロイメントシステム「Flatpak」の最新バージョンリリース NEW
  5. 5
    Amazon Qでコードレビューを自動化!開発・運用に役立つ注目アップデート【AWS re:Invent 2024 エンジニア向けまとめ】 NEW
  6. 6
    総務省、データサイエンス・オンライン講座「誰でも使える統計オープンデータ」をリニューアル開講 NEW
  7. 7
    プログラミング未経験からのITエンジニアへ転職の実態を調査、TAG STUDIOが発表 NEW
  8. 8
    Linuxディストリビューション「Debian 12.9」リリース NEW
  9. 9
    GitHub、「Git 2.48」のおもな新機能や変更点について公式ブログで紹介 NEW
  10. 10
    ガートナージャパン、急速に期待が高まるAIエージェントに関する最新の見解を発表 NEW
  1. 1
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  2. 2
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  3. 3
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  4. 4
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  5. 5
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  6. 6
    Google、社内AIエージェント「Google Agentspace」発表
  7. 7
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  8. 8
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  9. 9
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  10. 10
    管理職の24.1%、今後管理職を「続けたくない」と回答。理由は「責任やストレス」が最多に

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    実はITエンジニアの設計力が求められるkintone、その仕組みとポイントを事例に学ぶ NEW
  2. 2
    C# 13の新機能を理解する――paramsコレクションと新しいロックセマンティクス NEW
  3. 3
    ITエンジニア本大賞2025、ベスト10選出! 技術書部門とビジネス書部門の大賞はどうなる!?
  4. 4
    Linuxデスクトップ向けソフトウェアデプロイメントシステム「Flatpak」の最新バージョンリリース NEW
  5. 5
    Amazon Qでコードレビューを自動化!開発・運用に役立つ注目アップデート【AWS re:Invent 2024 エンジニア向けまとめ】 NEW
  1. 6
    総務省、データサイエンス・オンライン講座「誰でも使える統計オープンデータ」をリニューアル開講 NEW
  2. 7
    プログラミング未経験からのITエンジニアへ転職の実態を調査、TAG STUDIOが発表 NEW
  3. 8
    Linuxディストリビューション「Debian 12.9」リリース NEW
  4. 9
    GitHub、「Git 2.48」のおもな新機能や変更点について公式ブログで紹介 NEW
  5. 10
    ガートナージャパン、急速に期待が高まるAIエージェントに関する最新の見解を発表 NEW

アクセスランキング

  1. 1
    実はITエンジニアの設計力が求められるkintone、その仕組みとポイントを事例に学ぶ NEW
  2. 2
    C# 13の新機能を理解する――paramsコレクションと新しいロックセマンティクス NEW
  3. 3
    ITエンジニア本大賞2025、ベスト10選出! 技術書部門とビジネス書部門の大賞はどうなる!?
  4. 4
    Linuxデスクトップ向けソフトウェアデプロイメントシステム「Flatpak」の最新バージョンリリース NEW
  5. 5
    Amazon Qでコードレビューを自動化!開発・運用に役立つ注目アップデート【AWS re:Invent 2024 エンジニア向けまとめ】 NEW
  6. 6
    総務省、データサイエンス・オンライン講座「誰でも使える統計オープンデータ」をリニューアル開講 NEW
  7. 7
    プログラミング未経験からのITエンジニアへ転職の実態を調査、TAG STUDIOが発表 NEW
  8. 8
    Linuxディストリビューション「Debian 12.9」リリース NEW
  9. 9
    GitHub、「Git 2.48」のおもな新機能や変更点について公式ブログで紹介 NEW
  10. 10
    ガートナージャパン、急速に期待が高まるAIエージェントに関する最新の見解を発表 NEW
  1. 1
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  2. 2
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  3. 3
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  4. 4
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  5. 5
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  6. 6
    Google、社内AIエージェント「Google Agentspace」発表
  7. 7
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  8. 8
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  9. 9
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  10. 10
    管理職の24.1%、今後管理職を「続けたくない」と回答。理由は「責任やストレス」が最多に