源码位置:extdatephp_date.c
timelib_time *t, *지금;
timelib_tzinfo *tzi;
tzi = get_timezone_info(TSRMLS_C);
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, “sl”, ×, &time_len, &preset_ts) != 실패) {
/* 초기 타임스탬프가 있습니다 */
지금 = timelib_time_ctor();
initial_ts = emalloc(25);
snprintf(initial_ts, 24, “@%ld UTC”,preset_ts);
t = timelib_strtotime(initial_ts, strlen(initial_ts), NULL, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); /* 절대 실패해서는 안 되므로 여기서는 오류를 무시합니다. */
timelib_update_ts(t, tzi);
now->tz_info = tzi;
지금->zone_type = TIMELIB_ZONETYPE_ID;
timelib_unixtime2local(현재, t->sse);
timelib_time_dtor(t);
efree(initial_ts);
} else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “s|l”, ×, &time_len, &preset_ts) != 실패) {
/* 초기 타임스탬프가 없습니다 */
지금 = timelib_time_ctor();
now->tz_info = tzi;
지금->zone_type = TIMELIB_ZONETYPE_ID;
timelib_unixtime2local(현재, (timelib_sll) 시간(NULL));
} 그 밖의 {
RETURN_FALSE;
}
if (!time_len) {
timelib_time_dtor(현재);
RETURN_FALSE;
}
t = timelib_strtotime(times, time_len, &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper);
error1 = 오류->error_count;
timelib_error_container_dtor(오류);
timelib_fill_holes(t, 지금, TIMELIB_NO_CLONE);
timelib_update_ts(t, tzi);
ts = timelib_date_to_int(t, &error2);
timelib_time_dtor(현재);
timelib_time_dtor(t);
if (error1 || error2) {
RETURN_FALSE;
} 그 밖의 {
RETURN_LONG(ts);
}
}
/* }}} */
因此也引流写这篇文章,本文包括如下内容:
1).strtotime函数의 한 가지 용도
2).strtotime函数의 实现基本原리
3).strtotime(“-1개월”)求值失败의 원본
strtotime函数的一些사용법
1、 strtotime(“JAN”) 과 strtotime(“1월”)
这两个个个效果是一样的, city是返回指定月份的今天,如果指到份没有今天,则顺延到下一个月。代码:
2. 첫 번째 키워드
first는 확인값을 지정할 수 있는 week, day 등의 키워드와 조합하여 사용할 수 있는 보조 키워드입니다. 예를 들어 2011년 첫 번째 일요일을 찾으려면
첫 번째와 비슷하게 이전 키워드는 week, day와 함께 사용하여 요일이나 지정된 시간 이전의 날짜를 나타낼 수 있습니다. 코드는 다음과 같습니다.
다음 키워드는 이전 키워드와 반대되는 의미로, 다음 요일이나 모레를 나타냅니다.
4. 마지막 키워드
마지막 키워드는 이전 키워드나 마지막 키워드로 사용될 수 있습니다. 지난 일요일 날짜:
프로그램을 마지막으로 사용하는 경우, 적용 시나리오는 지정된 날짜가 있는 달의 마지막 날이 되며, 이는 date("t")의 결과와 동일합니다. 2000년 2월의 마지막 날을 찾으세요:
5. 앞뒤 키워드
이 두 키워드는 하루 시간에 대한 정방향 및 역방향 작업을 수행하며 호출 형식은 다음과 같습니다.
strtotime 함수 구현의 기본 원칙
공식 문서에서는 strtotime 함수에 대해 다음과 같이 설명합니다. 이 함수는 미국 영어 날짜 형식이 포함된 문자열을 허용하고 이를 Unix 타임스탬프로 구문 분석하려고 시도합니다(1970년 1월 1일 00:00:00 GMT 숫자 이후의 초). , 해당 값은 now 매개변수에 지정된 시간을 기준으로 합니다. 이 매개변수가 제공되지 않으면 현재 시스템 시간이 사용됩니다.
PHP4부터 존재했던 표준 PHP 내장 함수입니다. strtotime 함수는 확장으로 로드되며 전체 구현은 ext/date 디렉터리에서 사용할 수 있습니다. 표준 내장 함수로서 정의 형식도 다음과 같이 표준입니다.
// 관련 함수를 호출하여 문자열 파싱 및 결과 계산 구현
// 결과 반환
}
strtotime 함수의 첫 번째 매개변수는 문자열입니다. 이 문자열의 경우 복잡성으로 인해 PHP는 어휘 구문 분석과 동일한 도구인 re2c를 사용합니다. /ext/date/lib 디렉토리에서 pars_date.re 파일의 원본 re 파일을 볼 수 있습니다. 사용자가 매개변수 형태로 문자열을 전달하면 해당 문자열은 처리를 위해 이 프로그램으로 전달되며, 다른 문자열에 따라 다른 처리 기능이 일치됩니다. 예를 들어 strtotime("yesterday")이 호출되면 문자열을 분석할 때 어제 문자열과 일치합니다. 이 문자열에 해당하는 함수는 다음과 같습니다.
s->time->relative.d = -1;
TIMELIB_DEINIT;
TIMELIB_RELATIVE를 반환합니다.
}
struct timelib_time *time;
const timelib_tzdb *tzdb;
} 스캐너;
typedef struct timelib_time {
timelib_sll y, m, d; /* 연, 월, 일 */
timelib_sll h, i, s; /* 시, 분, 초 */
더블 f; /* 분수 */
int z; /* GMT 오프셋(분) */
문자 *tz_abbr; /* 시간대 약어(표시 전용) */
timelib_tzinfo *tz_info; /* 시간대 구조 */
서명된 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 멤버가 날짜/시간 멤버와 최신 상태인 경우 */
서명되지 않은 int tim_uptodate; /* !0 날짜/시간 멤버가 sse 멤버와 최신 상태인 경우 */
unsigned int is_localtime; /* 현재 구조체가 현지 시간을 나타내는 경우 1, GMT인 경우 0 */
unsigned int zone_type; /* 1시간 오프셋,
* 3 시간대 식별자,
* 2 TimeZone 약어 */
} timelib_time;
typedef struct timelib_rel_time {
timelib_sll y, m, d; /* 연, 월, 일 */
timelib_sll h, i, s; /* 시, 분, 초 */
int 평일; /* '다음 월요일'로 날짜를 저장합니다 */
int weekday_behavior; /* 0: 현재 날짜는 앞으로 나아갈 때 계산되지 *않습니다*; 1: 현재 날짜를 *계산해야* 합니다 */
int first_last_day_of;
int 반전; /* 차이를 반전할지 여부 */
timelib_sll 일; /* Y-M-D 차이 대신 *일* 수를 포함합니다 */
timelib_special 스페셜;
unsigned int have_weekday_relative, have_special_relative;
} timelib_rel_time;
strtotime(“-1개월”)求值失败의 원본
PHP样实现也无可厚不.只是我们的需求决决了我们不能使用这种方法,因此我们称其为求值失败。
relnumber = ([ -]*[ t]*[0-9] );
상대 = relnumber 공간? (reltextunit | 'week' );