PHP Manual
/
基礎知識

PHP 関数 date(), 日付と時刻

11. 09. 2019

Obsah článku

date()` 関数は日付と時刻を扱うためのツールである。2つのケースで使用されます。

  • 現在の状態**、すなわち現在の日付、時間、...を見つけること。を作成し、特定のフォーマットで出力します。
  • 特定の日付を別の形式に変換すること(例:月番号から名前、年表記形式、12時間制と24時間制、...)。

サンプル

Já jsem speciální stránka. Vím, že právě je
<?php
echo date('H:i'); // Hodina:minuta
?>

警告: PHP はあなたの時刻を表示するのではなく、サーバーの時刻を表示します。そのため、パソコンで設定した時刻と異なる時刻が表示されることがあります。

入力構文

この関数は通常の方法で呼び出され、個々のリクエストは関数の引数として入力される。

echo date('点数', atribut konkrétního času);

フォーマットマークは、どのようなフォーマットで日付が印刷されるかを示しています。マークには、スペース、ピリオド、コロン、ハイフン、その他それ自体がフォーマットマークでない文字が使えます(フォーマットマークを使いたい場合は、escape it としなければなりません)。各タグの概要は以下のとおりです。

第2(オプション)属性は、手動で入力された日付または時刻を示し、第1パラメータに従った形式に変換して出力する。タイムスタンプ(フォーマットタグ "U "で取得可能)を指定しなければならない。

echo date('d. m.Y', 1405856605); // 2014年7月20日まで。

許容されるフォーマット記号の表

文字|説明
Y`|年号を4桁で表記(例:1998年)
y`|2桁の数字で表す年号(例:98)
M`|月名の英語略語(例:Jan)
m`| 月番号(01~12)。
F`| 英文月名(例:January)
D`| 曜日を表す英語の略語 (例: Fri)
l`| 曜日の英語名(例:金曜日)
N`| 曜日番号(1-月曜日、7-日曜日)。
w`| 曜日番号(0 - 日曜日、1 - 月曜日、6 - 土曜日)。
d`| 月曜日 (01-31)
j`| 月の日数(1~31日)。
z`| 年月日(001~365日)
H`| 時間 (00-23)
h`|時間(01-12)
i|分(00-59)
秒 (00-59)
U`| タイムスタンプ: 時の始まりからの秒数(1970年1月1日以降)
S`| 月日の序数の英語語尾
A`|AM/PMインジケーター
a`| 午前/午後の指標(am/pm)
PHP 5.1.3 で追加された)グリニッジ標準時との時差を表すセパレータを時間と分の間に設定します。
g`
G`|時:24時間表示(0~23)。

サイトマップのタイムフォーマット

非常に頻繁に、<lastmod> タグに最後に変更された日時を含む sitemap.xml ファイルの時刻をフォーマットする必要があります。

PHP 5.1.3 以降では、次のような構文でこれを行うことができます。

date('Y-m-dTH:i:sP');

日付と時刻は秒単位で表示され、サーバーが置かれているタイムゾーンの情報も含まれます(タイムゾーンはサーバーのオペレーティングシステムによって決定されます)。

チェコ語の曜日と月名の取得

PHPでは、チェコ語の曜日と月の名前を普通に取得することはできないので、そのような値を自分で記述する必要があります。最良の方法は、エントリーを配列に格納し、インデックスコールを使って取り出すことです。

$mesice = [
1 => '1月', '2月', '3月', '4月', '5月',
'6月', '7月', '8月', '9月', '10月',
'11月', '12月'
];
$dny = ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'];

この例は、Jakub Vrana の記事 Czech names of months and days of the week から簡略化した例である。

英語から英語への日付の翻訳

よく「Friday, 13 September」という形式の日付があり、それを英語に翻訳したいのですが、どうすればいいのでしょうか。一番良い方法は、例えば datumcesky() といった関数を呼び出して、英語の日付を渡すと、それが翻訳されるようにすることです。

function datumCesky(string $date): string
{
$men = [
'1月', '2月', '3月', '4月', '5月',
'6月', '7月', '8月', '9月', '10月',
'11月', '12月'
];
$mcz = [
'1月', '2月', '3月', '4月', '5月',
'6月', '7月', '8月', '9月', '10月',
'11月', '12月'
];
$date = str_replace($men, $mcz, $date);
$den = [
'月曜日', '火曜日', '水曜日', '木曜日',
'金曜日', '土曜日', '日曜日'
];
$dcz = [
'月曜日', '火曜日', '水曜日', '木曜日',
'金曜日', '土曜日', '日曜日'
];
return str_replace($den, $dcz, $date);
}

使用例

echo datumCesky('9月13日(金)'); // 12月13日(金)

この機能は、英語の単語をチェコ語の単語に置き換えるだけなので、確かに翻訳には向いていませんが、多くのデプロイメントには十分でしょう。より高度な翻訳をする場合は、常に正確な構文を保証して、統一されたスタイルに翻訳する必要があります(例:Friday, December 13)。

月の初日を探す

2018年4月1日は日曜日でしたが、簡単に調べるにはどうしたらいいでしょうか?

PHP 5.1.0 以降では、簡単な解決策があります。

echo date('N', strtotime('2018-04-01')); // 1日(月)、7日(日)

古いバージョンでは、私たち自身がこの機能を実装しなければなりません。

/**
* 著者 ヤン・バラシェック
*/
function getFirstDayPosition(?int $year = null, ?int $month = null): int
{
$day = (int) date('w', strtotime($year . '-' . $month . '-1')) - 1;
return $day < 0 ? 7 : $day + 1;
}

w` 修飾子はUSフォーマットで出力を返すので、私は単純な計算で日数を調整することにしています。この関数は、1(月曜日)から7(日曜日)までの整数を返します。

タイムオフセット/フォーマット変換、日付検証

多くの場合、相対的な時間(たとえば+5日)でジャンプしたり、ユーザーのテキスト入力から日付を引っ張ってきて有効にしたりする必要があります。そのために、strtotime()関数で以下の構文が使えるようになっています。

echo strtotime('此処に於て');
echo strtotime('2000年9月10日');
echo strtotime('+1日');
echo strtotime('+1週間');
echo strtotime('+1週間 2日 4時間 2秒');
echo strtotime('次の木曜日');
echo strtotime('先週の月曜日');

この関数の出力は、指定された時刻のtimestamp (universal time)*であり、整数値である。

一般的に、この関数は、ユーザーの時間を扱うすべてのフォームに配置することをお勧めします。確かに、ユーザーに特定のフォーマットで日付を書くことを強制するのは良くないが、常にそのようなフォーマットを自動的に作成し、ユーザーが好きなように書けるようにする。なぜなら、例えばテキストはどこからかコピーしてきたものであることが多く、自動でできるのに手動で再フォーマットするのは手間がかかりすぎるからです。

時刻の開始からの秒数

1970年1月1日以降、1秒ごとに1を足し、それ以降の経過時間を示す巨大な整数になる。特に、単純に時差を計算する場合に便利です。かなり確実な解決策ではあるが、リスクもある(2038年問題)。

この表記法の一般的な特性:

  • 整数なので、作業がしやすい。
  • 10進法だから人間にも読みやすい(正確な時間がすぐにわからないことを除けば)。
  • 1970年1月1日以前の期間を表すには、負の値にすることができないため、使用できません*(アルゴリズムの新しいバージョンでは負の時間を実装しているものもありますが、常にそれに依存することはできません)*。
  • 2038年には32ビットコンピュータで動作しなくなり、プログラムがクラッシュするようになります(スタックオーバーフローと最大整数サイズのため)。

2038年問題

読まない...

.

このテキストの上に現在の時刻値が表示され、1秒ごとに+1される。現在値はjavascriptによって読み込まれるため、必ずしも正確でない場合があります(コンピューターのシステム時間を示しています)。

コンピュータは整数を2進数で記憶しており、整数であれば32ビット(1と0が32個)であることが多い。32ビットで可能な最高値は、011 111 111 111 111 111 111 11です。

しかし、この定数に1秒ごとに+1していけば、いつかこのような数字が得られる*(2038年1月19日03時14分07秒)*。つまり、数字の先頭に1が追加され、2進数では負の数となり、(おそらくプログラムがクラッシュする)1901年のどこかに行くことになります(うっ!)。

この問題には、2つの解決策があります。

  • 整数の範囲を32ビットから64ビットに拡張し、数千年のスパンを実現する
  • PHPで一般的に利用されている DateTime データ型を使用します。これは、日付管理に対するオブジェクト指向のアプローチを提供し、データベースとの互換性が高く、 0001 から 9999 までの年数を提供します。これは、ほとんどの実際のアプリケーションのニーズに対して十分なものです。

個人的には、データ型は DateTime を使用し、整数のストレージは一切使用しないことを推奨します。

異なるタイムゾーン

PHPはインテリジェントなので、サーバーが置かれている現在の最適なタイムゾーンを常に使用しようとします。しかし、タイムゾーンの指定に誤りがあったり、世界中のユーザーがアクセスするグローバルなアプリケーションをプログラミングしているため、手動でタイムゾーンを変更する必要がある場合があります。

これは、関数を呼び出すことで、PHP スクリプト全体に対してグローバルに行うことができます。

date_default_timezone_set('協定世界時');

時折、この解決策(サーバーがUTC以外のタイムゾーンを持つことを検出する)に遭遇することもあります。

$defaultTimeZone = '協定世界時';
if (date_default_timezone_get() != $defaultTimeZone) {
date_default_timezone_set($defaultTimeZone);
}

日付と時刻を変更する

現在の日付と時刻を取得するのは PHP 自身ではなく、PHP が動作しているオペレーティングシステムが担当します。そのため、手動で時間を変更する必要がある場合は、そこで変更します。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
6.
Status:
All systems normal.
2024