phpstrtotime 함수의 사용 상세 이해

7679 단어 phpstrtotime 함수
앞의 <PHP를 사용하여 지난 달의 오늘을 계산하는 방법>에서 우리는 strtotime 함수가strtotime("-1month")를 사용하여 지난달의 오늘을 구하는 데 약간의 상황이 발생한다고 언급했기 때문에 이 글을 쓴다. 본고는 다음과 같은 내용을 포함한다. •strtotime 함수의 일부 용법 •strtotime 함수의 실현 기본 원리 •strtotime("-1month")의 값 구하기 실패 원인인strtotime 함수의 일부 용법 1.strtotime ("JAN") 과 strtotime ("January") 두 용법의 효과는 같다. 모두 지정된 달의 오늘을 되돌려주고, 지정된 달이 오늘이 없으면 다음 달로 순연된다.2011-03-31에서 2월을 계산하면 코드:

echo date("Y-m-d H:i:s", strtotime("feb", strtotime("2011-03-31")));
프로그램은 2011-03-03 00:00:00에 출력됩니다.표상으로 볼 때 이 결과가 반드시 우리가 원하는 것은 아닐 수도 있지만, 이것도 일종의 해결 방안이라고 할 수 있다. 이런 방안은 무엇에 의해 결정되는가?strtotime 함수는 월의 계산을 실행할 때 월만 계산합니다. 월을 지정한 월의 값으로 직접 설정하는 것과 같습니다. 예를 들어 jan,january는 내부 수치에 대응합니다.2. first 키워드first는 보조적인 키워드로 일요일, 일 등 확인 값을 지정할 수 있는 키워드와 조합하여 사용할 수 있다. 예를 들어 2011년의 첫 번째 일요일을 구한다.

echo date("Y-m-d H:i:s", strtotime("second sunday", strtotime("2011-01-01"))), "<br />"; 
PHP의 원본 코드에서first와 일요일의 조합 사용은 분리된다. 즉first day는 처리 작업에 대응하고 최종 C 구현에서 일의 값은 1, 즉time 구조의 d 필드는 1로 지정한다.다음 코드:

switch (time->relative.first_last_day_of) { 
         case 1: /* first */ 
             time->d = 1; 
             break; 
         case 2: /* last */ 
             time->d = 0; 
             time->m++; 
             break; 
     }
3,previous와next 키워드는first와 유사하고,previous 키워드는 일요일, 일요일과 조합하여 사용할 수 있으며, 지정된 시간의 직전 일요일 또는 전날을 나타낸다.다음과 같은 코드:

echo date("Y-m-d H:i:s", strtotime("previous sunday", strtotime("2011-02-01"))), "<br />"; 
프로그램은 2011-01-30 00:00:00 프로그램에서 2011-02-01의 일요일을 구합니다.next 키워드는previous와 반대로 다음 주 몇 주 또는 다음 날을 표시합니다.4. last 키워드 last 키워드는 이전이 될 수도 있고 마지막이 될 수도 있습니다.지난 일요일의 날짜를 구하면:

echo date("Y-m-d H:i:s", strtotime("last sunday", strtotime("2011-02-05"))), "<br />"; 
프로그램이 출력합니다. 2011-01-30 00:00:00 프로그램이 마지막일 때 그 응용 장면은 지정된 날짜가 있는 달의 마지막 날로date("t")에 해당하는 결과입니다.2000년 2월의 마지막 날을 구하면:

echo date("Y-m-d H:i:s", strtotime("last day", strtotime("2000-02-01"))), "<br />"; 
first,previous,last,this 키워드는re 파일에서 같은 그룹에 속한다.5. back과front 키워드 두 키워드는 하루 중 시간을 앞뒤로 하는 것입니다. 호출 형식은 다음과 같습니다.

echo date("Y-m-d H:i:s", strtotime("back of 24", strtotime("2011-02-01"))), "<br />"; 
echo date("Y-m-d H:i:s", strtotime("front of 24", strtotime("2011-02-01"))), "<br />"; 
• back은 시간을 지정한 시간 값의 다음 시간 15분의 위치로 설정합니다.24시라면 다음날 0시 15분까지 계산한다.front는 지정된 시간 값의 이전 시간 45분 위치를 설정합니다.0시라면 전날의 23시 45분을 계산한다.위의 코드 출력: 2011-02-02 00:15:00 2011-02-01 23:45:00.그 중에서 back of 와front of 후접의 수조는 0보다 크고 24보다 작아야 한다.strtotime 함수의 실현 기본 원리 공식 문서에서 strtotime 함수에 대한 설명은 다음과 같다. 본 함수는 미국 영어 날짜 형식을 포함하는 문자열을 받아들여 유닉스 타임 스탬프(1월 1일 197000:00:00 GMT에서 시작된 초)로 해석하려고 한다. 그 값은 now 파라미터가 제시한 시간에 비해 이 파라미터를 제공하지 않으면 시스템의 현재 시간을 사용한다.이것은 표준 PHP 내장 함수로서 PHP4부터 존재했다.strtotime 함수는 ext/date 디렉터리에서 확장된 방식으로 불러옵니다.표준의 내장 함수로서 그 정의 형식도 표준이다. 다음과 같다.

PHP_FUNCTION(strtotime) 
//  ,  
 //  ,  
//   

입력 처리에서 두 개의 매개 변수가 모두 존재하는 상황을 식별하고 처리한다. 이 상태가 아니라면 두 번째 매개 변수가 존재하지 않는 상황을 처리하고 없으면 오류를 보고하고 FALSE로 돌아간다.strtotime 함수의 첫 번째 매개 변수는 문자열입니다. 이 문자열에 대해 복잡성 때문에 PHP는 그 어법 해석과 같은 도구를 사용합니다:re2c./ext/date/lib 디렉터리에서parse_date.re 파일은 원시적인 re 파일을 볼 수 있습니다.사용자가 매개 변수 형식으로 문자열을 전송하면 이 문자열은 이 프로그램에 전달되어 문자열에 따라 다른 처리 함수와 일치합니다.예를 들어strtotime('yesterday')를 호출할 때 문자열을 분석할 때 yesterday 문자열과 일치합니다. 이 문자열의 대응 함수는 다음과 같습니다.

'yesterday' 
     { 
         DEBUG_OUTPUT("yesterday"); 
         TIMELIB_INIT; 
         TIMELIB_HAVE_RELATIVE(); 
         TIMELIB_UNHAVE_TIME(); 
         s->time->relative.d = -1; 
         TIMELIB_DEINIT; 
         return TIMELIB_RELATIVE; 
     }
여기에는 몇 가지 관건적인 구조체가 있습니다.PHP는 이렇게 실현해도 크게 비난할 수 없다.단지 우리의 수요가 우리가 이런 방법을 사용할 수 없다는 것을 결정했기 때문에 우리는 그것을 가치 추구 실패라고 부른다.두 번째 파라미터가 없기 때문에 프로그램은 기본 현재 시간을 사용합니다.첫 번째 매개 변수는 -1 month 문자열입니다. 이 문자열에 대응하는 re 파일의 정규는 다음과 같습니다.

typedef struct Scanner { 
         int           fd; 
         uchar        *lim, *str, *ptr, *cur, *tok, *pos; 
         unsigned int  line, len; 
         struct timelib_error_container *errors; 
         struct timelib_time *time; 
         const timelib_tzdb  *tzdb; 
     } Scanner; 
     typedef struct timelib_time { 
         timelib_sll      y, m, d;     /* Year, Month, Day */ 
         timelib_sll      h, i, s;     /* Hour, mInute, Second */ 
         double           f;           /* Fraction */ 
         int              z;           /* GMT offset in minutes */ 
         char            *tz_abbr;     /* Timezone abbreviation (display only) */ 
         timelib_tzinfo  *tz_info;     /* Timezone structure */ 
         signed int       dst;         /* Flag if we were parsing a DST zone */ 
         timelib_rel_time relative; 
         timelib_sll      sse;         /* Seconds since epoch */ 
         unsigned int   have_time, have_date, have_zone, have_relative, have_weeknr_day; 
         unsigned int   sse_uptodate; /* !0 if the sse member is up to date with the date/time members */ 
         unsigned int   tim_uptodate; /* !0 if the date/time members are up to date with the sse member */ 
         unsigned int   is_localtime; /*  1 if the current struct represents localtime, 0 if it is in GMT */ 
         unsigned int   zone_type;    /*  1 time offset,
                                       *  3 TimeZone identifier,
                                       *  2 TimeZone abbreviation */ 
     } timelib_time; 
     typedef struct timelib_rel_time { 
         timelib_sll y, m, d; /* Years, Months and Days */ 
         timelib_sll h, i, s; /* Hours, mInutes and Seconds */ 
         int weekday; /* Stores the day in 'next monday' */ 
         int weekday_behavior; /* 0: the current day should *not* be counted when advancing forwards; 1: the current day *should* be counted */ 
         int first_last_day_of; 
         int invert; /* Whether the difference should be inverted */ 
         timelib_sll days; /* Contains the number of *days*, instead of Y-M-D differences */ 
         timelib_special  special; 
         unsigned int   have_weekday_relative, have_special_relative; 
     } timelib_rel_time;
최종relative는 일련의 작업에 대응하고 프로그램은 앞의 -1과 뒤의 month 문자열을 식별합니다. month는 하나의 작업 유형에 대응합니다. TIMELIB_MONTH . 그 다음에 식별된 숫자와 조작 유형에 따라 다음과 같은 코드를 실행한다.

reltextunit = (('sec'|'second'|'min'|'minute'|'hour'|'day'|'fortnight'|'forthnight'|'month'|'year') 's'?) | 'weeks' | daytext; 
relnumber = ([+-]*[ /t]*[0-9]+); 
relative = relnumber space? (reltextunit | 'week' ); 
상기 코드와 같이 달의 상대값을 직접 기록하여 1을 줄인다.그러나 3월 31일과 같은 경우 2월에 31일이 없으면 프로그램은 자동으로 날짜를 다음 달로 계산한다.

좋은 웹페이지 즐겨찾기