ホームページ  >  記事  >  バックエンド開発  >  PHP strtotime 関数の深い理解_PHP チュートリアル

PHP strtotime 関数の深い理解_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:17:41859ブラウズ

•strtotime関数の使用例
•strtotime関数実装の基本原則
•strtotime(”-1 month”)の評価が失敗した理由
strtotime関数の使用例
1. strtotime("JAN") と strtotime(" January")
これら 2 つの使用法の効果はどちらも同じです。指定した月に今日がない場合は、次の月に延期されます。 たとえば、2 月が 2011-03-31 に計算される場合、コードは次のようになります:

コードは以下のように表示されます。
echo date("Y-m-d H:i:s", strtotime("feb", strtotime("2011-03-31")));


プログラムは、2011-03-03 00:00:00 を出力します。 見た目の観点からは、この結果は必ずしも望ましいものではないかもしれませんが、この解決策を決定するものは何でしょうか。 strtotime 関数は、月を計算するときにのみ月を計算します。これは、月を指定した月の値に直接設定することと同じであり、jan や January などは対応する内部値を持ちます。
2.最初のキーワード
1 つ目は補助キーワードで、2011 年の最初の日曜日を見つけるなど、確認値を指定できる週、日などのキーワードと組み合わせて使用​​できます。 コードは以下のように表示されます。

echo date("Y-m-d H:i:s", strtotime("第 2 日曜日", strtotime("2011-01-01"))), "
";

PHP ソース コードでは、first、week、day の組み合わせは別々に使用されます。つまり、first day は処理操作に対応し、最終的な C 実装では、day の値は 1、つまり d フィールドに指定されます。時間構造体の は 1 として指定されます。次のコード:
コードは以下のように表示されます。

switch (time->relative.first_last_day_of) {
ケース 1: /* 最初 */
時間 > d = 1; 休憩
ケース 2: /* 最後 */
時間>d = 0; 時間>m++; 休憩
}

3. 前後のキーワード
first と同様に、previous キーワードは、week および day と組み合わせて使用​​して、指定した時刻の曜日または前日を示すことができます。コードは次のとおりです:
コードは以下のように表示されます:

echo date("Y-m-d H:i:s", strtotime("前の日曜日", strtotime("2011-02-01"))), "
";

プログラムは次のように出力します: 2011-01-30 00:00:00

プログラムは 2011 年 2 月 1 日より前の日曜日を探します。
次のキーワードは前のキーワードとは逆で、次の曜日または翌日を表します。

4. 最後のキーワード
last キーワードは、前または最後のキーワードとして使用できます。先週の日曜日の日付が必要な場合:
コードは以下のように表示されます。
echo date("Y-m-d H:i:s", strtotime("最後の日曜日", strtotime("2011-02-05"))), "
";

プログラムは次のように出力します: 2011-01-30 00:00:00

プログラムが最後のプログラムとして使用される場合、その適用シナリオは、指定された日付が位置する月の最終日となり、これは date("t") の結果と等価です。 2000 年 2 月の最後の日についてお問い合わせください:
コードをコピーする コードは次のとおりです。

echo date("Y-m-d H:i:s", strtotime("最終日", strtotime("2000-02-01"))), "
";

first、previous、last、および this キーワードは、re ファイル内の同じグループに属します。

5. 裏と表のキーワード
これら 2 つのキーワードは、その日の時間帯の順方向および逆方向の操作であり、その呼び出し形式は次​​のとおりです:

コードは以下のように表示されます:
echo date("Y-m-d H:i:s", strtotime("back of 24", strtotime("2011-02-01"))), "
"; echo date("Y-m-d H:i:s", strtotime("24 の先頭", strtotime("2011-02-01"))), "
";

•back は、指定した時の値の 15 分後に時刻を設定することを意味します。 24:00の場合は翌日の0:15までカウントされます。

•前とは、指定した時の値の 45 分前に時刻を設定することを意味します。 0時なら前日の23時45分として計算されます。
上記のコードは、2011-02-02 00:15:00 2011-02-01 23:45:00 を出力します。 配列の後に後部と前部が続く場合は、0 以上、24 以下である必要があります。
strtotime関数実装の基本原則

公式ドキュメントでは、strtotime 関数について次のように説明されています。この関数は、米国英語の日付形式を含む文字列を受け入れ、それを Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 GMT からの秒数) に解析しようとします。この値は、now パラメータで指定された時刻を基準としています。このパラメータが指定されていない場合は、現在のシステム時刻が使用されます。
これは、PHP4 から存在する標準の PHP 組み込み関数です。 strtotime 関数は拡張機能としてロードされ、その完全な実装は ext/date ディレクトリで入手できます。 標準の組み込み関数として、その定義形式も次のように標準です。
コードは以下のように表示されます:
PHP_FUNCTION(strtotime)
// 2 番目のパラメーターがあるかどうかに関係なく、入力を処理します
// 関連関数を呼び出して文字列の解析と結果の計算を実装します
//結果を返す
}


入力処理では、まず両方のパラメータが存在する状況が識別されて処理され、この状態にない場合は、2 番目のパラメータが存在しない状況が処理され、どちらのパラメータも存在しない場合はエラーが報告され、FALSE が返されます。 。
strtotime 関数の最初のパラメータは文字列です。この文字列は複雑であるため、PHP は字句解析と同じツール re2c を使用します。 /ext/date/lib ディレクトリでは、parse_date.re ファイルから元の re ファイルを確認できます。 ユーザーがパラメータの形式で文字列を渡すと、その文字列は処理のためにこのプログラムに渡され、異なる文字列に応じて異なる処理関数が照合されます。 strtotime("yesterday") が呼び出された場合、文字列を分析するときに、この文字列に対応する関数は次のとおりです。 コードは以下のように表示されます:

「昨日」
{
DEBUG_OUTPUT("昨日"); タイムリブ_INIT
TIMELIB_HAVE_RELATIVE(); TIMELIB_UNHAVE_TIME(); s->time->relative.d = -1; TIMELIB_DEINIT
TIMELIB_RELATIVE を返します。 }

以下にいくつかの主要な構造を示します:
コードは以下のように表示されます:
typedef 構造体スキャナ {
内部 fd; uchar *lim、*str、*ptr、*cur、*tok、*pos; unsigned int 行、len
struct timelib_error_container *エラー

構造体 timelib_time *時間
const timelib_tzdb *tzdb; スキャナー

typedef struct timelib_time {
timelib_sll y, m, d /* 年、月、日 */
timelib_sll h, i, s /* 時、分、秒 */
double f; /* 分数 */
int z; /* 分単位の GMT オフセット */
char *tz_abbr; /* タイムゾーンの略語 (表示のみ) */
timelib_tzinfo *tz_info; /* タイムゾーン構造体 */
signed int dst; /* DST ゾーンを解析しているかどうかを示すフラグ */
timelib_rel_time 相対値
timelib_sll sse; /* エポックからの秒数 */
unsigned int have_time、have_date、have_zone、have_relative、have_weeknr_day
unsigned int sse_uptodate; /* !0 sse メンバーの日付/時刻メンバーが最新の場合 */
unsigned int tim_uptodate; /* 日時メンバーが sse メンバーと最新の場合は !0 */
unsigned int is_localtime; /* 現在の構造体がローカルタイムを表す場合は 1、GMT の場合は 0 */
unsigned intzone_type; /* 1 時間のオフセット、
* 3 タイムゾーン識別子、
*2 TimeZoneの略称 */
タイムリブタイム
typedef struct timelib_rel_time {
timelib_sll y, m, d /* 年、月、日 */
timelib_sll h, i, s; /* 時、分、秒 */
int Weekday; /* 曜日を「次の月曜日」に格納します */
int Weekday_behavior; /* 0: 前に進むときに、現在の日は * カウントされません * 1: 現在の日は */ カウントされます */
int first_last_day_of; int invert; /* 差を反転する必要があるかどうか */
timelib_sll days; /* Y-M-D の差ではなく * 日* の数が含まれます */
timelib_special スペシャル
unsigned int have_weekday_relative、have_special_relative
timelib_rel_time;

strtotime(”-1 month”) の評価が失敗した理由
strtotime("-1 month") メソッドは前月と比較して翌月の日数を評価できませんが、本質的には何も問題ありません。 PHP の実装には何も問題はありません。ニーズによってこの方法を使用できないというだけなので、これを評価失敗と呼びます。
その実装プロセスを見てみましょう。2 番目のパラメータがないため、プログラムはデフォルトの現在時刻を使用します。 最初のパラメータは -1 month 文字列で渡されます。この文字列に対応する re ファイル内の正規表現は次のとおりです。 コードは以下のように表示されます:
reltextunit = (('秒'|'秒'|'分'|'分'|'時'|'日'|'二週間'|'昨夜'|'月'|'年') 's'?) | '週' | 日のテキスト; relnumber = ([+-]*[ /t]*[0-9]+); 相対 = relnumber スペース? (reltextunit | 'week' );

最終的に、相対は一連の操作に対応し、プログラムは先頭の -1 と後ろの月文字列を認識します: TIMELIB_MONTH。 この後、次のコードに示すように、認識された番号と操作の種類に基づいて操作が実行されます。 コードは以下のように表示されます:
case TIMELIB_MONTH: s->time->relative.m += amount * relunit->multiplier;

上記のコードは、月から 1 を引いた相対値を直接記録します。 ただし、2 月に 31 日がない 3 月 31 日のような状況では、プログラムは自動的に翌月までの日付を計算します。



www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/371972.html技術記事 strtotime 関数の使用例 strtotime 関数の実装の基本原則 strtotime(-1 month) の評価が失敗する理由 strtotime 関数の使用例 1. strtotime(JAN) と strtotime(Monday)...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。