25
25
#include "php.h"
26
26
#include "php_ini.h"
27
27
#include "ext/standard/info.h"
28
+ #include "ext/date/php_date.h"
28
29
29
30
#if !defined(PHP_VERSION_ID ) || PHP_VERSION_ID < 50300
30
- #include "ext/date/php_date.h"
31
31
#include "ext/date/lib/timelib.h"
32
32
#endif
33
33
@@ -66,6 +66,9 @@ static const struct timecop_override_def timecop_ovld_func[] = {
66
66
{"gmstrftime" , "timecop_gmstrftime" , "timecop_orig_gmstrftime" },
67
67
{"unixtojd" , "timecop_unixtojd" , "timecop_orig_unixtojd" },
68
68
{"date_create" , "timecop_date_create" , "timecop_orig_date_create" },
69
+ #if PHP_VERSION_ID >= 50300
70
+ {"date_create_from_format" , "timecop_date_create_from_format" , "timecop_orig_date_create_from_format" },
71
+ #endif
69
72
{NULL , NULL , NULL }
70
73
};
71
74
/* }}} */
@@ -157,6 +160,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_timecop_date_create, 0, 0, 0)
157
160
ZEND_ARG_INFO (0 , object )
158
161
ZEND_END_ARG_INFO ()
159
162
163
+ #if PHP_VERSION_ID >= 50300
164
+ ZEND_BEGIN_ARG_INFO_EX (arginfo_timecop_date_create_from_format , 0 , 0 , 2 )
165
+ ZEND_ARG_INFO (0 , format )
166
+ ZEND_ARG_INFO (0 , time )
167
+ ZEND_ARG_INFO (0 , object )
168
+ ZEND_END_ARG_INFO ()
169
+ #endif
170
+
160
171
#if !defined(PHP_VERSION_ID ) || PHP_VERSION_ID < 50300
161
172
ZEND_BEGIN_ARG_INFO_EX (arginfo_timecop_date_method_timestamp_set , 0 , 0 , 1 )
162
173
ZEND_ARG_INFO (0 , unixtimestamp )
@@ -184,6 +195,9 @@ const zend_function_entry timecop_functions[] = {
184
195
PHP_FE (timecop_gmstrftime , arginfo_timecop_gmstrftime )
185
196
PHP_FE (timecop_unixtojd , arginfo_timecop_unixtojd )
186
197
PHP_FE (timecop_date_create , arginfo_timecop_date_create )
198
+ #if PHP_VERSION_ID >= 50300
199
+ PHP_FE (timecop_date_create_from_format , arginfo_timecop_date_create_from_format )
200
+ #endif
187
201
{NULL , NULL , NULL }
188
202
};
189
203
/* }}} */
@@ -194,6 +208,10 @@ const zend_function_entry timecop_functions[] = {
194
208
static zend_function_entry timecop_datetime_class_functions [] = {
195
209
PHP_ME (TimecopDateTime , __construct , arginfo_timecop_date_create ,
196
210
ZEND_ACC_CTOR | ZEND_ACC_PUBLIC )
211
+ #if PHP_VERSION_ID >= 50300
212
+ PHP_ME_MAPPING (createFromFormat , timecop_date_create_from_format , arginfo_timecop_date_create_from_format ,
213
+ ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
214
+ #endif
197
215
#if !defined (PHP_VERSION_ID ) || PHP_VERSION_ID < 50300
198
216
PHP_ME (TimecopDateTime , getTimestamp ,
199
217
arginfo_timecop_date_method_timestamp_get , 0 )
@@ -251,7 +269,7 @@ static int restore_request_time(TSRMLS_D);
251
269
static long timecop_current_timestamp (TSRMLS_D );
252
270
253
271
static int fill_mktime_params (zval * * * params , const char * date_function_name , int from TSRMLS_DC );
254
- static int fix_datetime_timestamp (zval * * datetime_obj , zval * time TSRMLS_DC );
272
+ static int fix_datetime_timestamp (zval * * datetime_obj , zval * time , zval * timezone_obj TSRMLS_DC );
255
273
256
274
static void _timecop_call_function (INTERNAL_FUNCTION_PARAMETERS , const char * function_name , zval * * retval_ptr_ptr , int index_to_fill_timestamp );
257
275
static void _timecop_call_mktime (INTERNAL_FUNCTION_PARAMETERS , const char * mktime_function_name , const char * date_function_name , zval * * retval_ptr_ptr );
@@ -520,7 +538,6 @@ static int update_request_time(long unixtime TSRMLS_DC)
520
538
MAKE_STD_ZVAL (tmp );
521
539
ZVAL_LONG (tmp , unixtime );
522
540
add_assoc_zval (* server_vars , "REQUEST_TIME" , tmp );
523
- zval_dtor (tmp );
524
541
}
525
542
526
543
return SUCCESS ;
@@ -538,7 +555,6 @@ static int restore_request_time(TSRMLS_D)
538
555
Z_TYPE_PP (server_vars ) == IS_ARRAY &&
539
556
zend_hash_find (Z_ARRVAL_PP (server_vars ), "REQUEST_TIME" , sizeof ("REQUEST_TIME" ), (void * * ) & request_time ) == SUCCESS ) {
540
557
add_assoc_zval (* server_vars , "REQUEST_TIME" , orig_request_time );
541
- zval_dtor (orig_request_time );
542
558
TIMECOP_G (orig_request_time ) = NULL ;
543
559
}
544
560
return SUCCESS ;
@@ -589,10 +605,11 @@ static int fill_mktime_params(zval ***params, const char *date_function_name, in
589
605
return MKTIME_NUM_ARGS ;
590
606
}
591
607
592
- static int fix_datetime_timestamp (zval * * datetime_obj , zval * time TSRMLS_DC )
608
+ static int fix_datetime_timestamp (zval * * datetime_obj , zval * time , zval * timezone_obj TSRMLS_DC )
593
609
{
594
610
zval * orig_timestamp , * fixed_timestamp ;
595
611
zval now ;
612
+ zval * orig_zonename ;
596
613
597
614
INIT_ZVAL (now );
598
615
ZVAL_STRING (& now , "now" , 0 );
@@ -611,7 +628,18 @@ static int fix_datetime_timestamp(zval **datetime_obj, zval *time TSRMLS_DC)
611
628
}
612
629
613
630
zend_call_method_with_0_params (datetime_obj , Z_OBJCE_PP (datetime_obj ), NULL , "gettimestamp" , & orig_timestamp );
631
+ if (timezone_obj ) {
632
+ zval * zonename ;
633
+ zend_call_method_with_0_params (& timezone_obj , Z_OBJCE_PP (& timezone_obj ), NULL , "getname" , & zonename );
634
+ zend_call_method_with_0_params (NULL , NULL , NULL , "date_default_timezone_get" , & orig_zonename );
635
+ zend_call_method_with_1_params (NULL , NULL , NULL , "date_default_timezone_set" , NULL , zonename );
636
+ zval_ptr_dtor (& zonename );
637
+ }
614
638
zend_call_method_with_1_params (NULL , NULL , NULL , "timecop_strtotime" , & fixed_timestamp , time );
639
+ if (timezone_obj ) {
640
+ zend_call_method_with_1_params (NULL , NULL , NULL , "date_default_timezone_set" , NULL , orig_zonename );
641
+ zval_ptr_dtor (& orig_zonename );
642
+ }
615
643
616
644
if (Z_TYPE_P (fixed_timestamp ) == IS_BOOL && Z_BVAL_P (fixed_timestamp ) == 0 ) {
617
645
// timecop_strtotime($time) === false
@@ -881,14 +909,39 @@ PHP_FUNCTION(timecop_date_create)
881
909
}
882
910
/* }}} */
883
911
912
+ #if PHP_VERSION_ID >= 50300
913
+ /* {{{ proto TimecopDateTime timecop_date_create_from_format(string format, string time[, DateTimeZone object])
914
+ Returns new TimecopDateTime object
915
+ */
916
+ PHP_FUNCTION (timecop_date_create_from_format )
917
+ {
918
+ zval * timezone_object = NULL ;
919
+ char * time_str = NULL , * format_str = NULL ;
920
+ int time_str_len = 0 , format_str_len = 0 ;
921
+
922
+ #if PHP_VERSION_ID <= 50303
923
+ php_error_docref (NULL TSRMLS_CC , E_ERROR , "Currently this method is unsupported on PHP 5.3.0-5.3.3. Please upgrade PHP to 5.3.4+." );
924
+ #else
925
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "ss|O" , & format_str , & format_str_len , & time_str , & time_str_len , & timezone_object , php_date_get_timezone_ce ()) == FAILURE ) {
926
+ RETURN_FALSE ;
927
+ }
928
+
929
+ php_timecop_date_instantiate (TIMECOP_G (ce_TimecopDateTime ), return_value TSRMLS_CC );
930
+ if (!php_date_initialize (zend_object_store_get_object (return_value TSRMLS_CC ), time_str , time_str_len , format_str , timezone_object , 0 TSRMLS_CC )) {
931
+ RETURN_FALSE ;
932
+ }
933
+ #endif
934
+ }
935
+ /* }}} */
936
+ #endif
937
+
884
938
/* {{{ proto TimecopDateTime::__construct([string time[, DateTimeZone object]])
885
939
Creates new TimecopDateTime object
886
940
*/
887
941
PHP_METHOD (TimecopDateTime , __construct )
888
942
{
889
943
zval * * * params ;
890
944
zval * obj = getThis ();
891
- zval * time = NULL ;
892
945
zend_class_entry * datetime_ce ;
893
946
894
947
params = (zval * * * ) safe_emalloc (ZEND_NUM_ARGS (), sizeof (zval * * ), 0 );
@@ -902,10 +955,14 @@ PHP_METHOD(TimecopDateTime, __construct)
902
955
call_constructor (& obj , TIMECOP_G (ce_DateTime ), params , ZEND_NUM_ARGS () TSRMLS_CC );
903
956
904
957
if (!EG (exception )) {
958
+ zval * time = NULL , * timezone_obj = NULL ;
905
959
if (ZEND_NUM_ARGS () >= 1 ) {
906
960
time = * params [0 ];
907
961
}
908
- fix_datetime_timestamp (& obj , time TSRMLS_CC );
962
+ if (ZEND_NUM_ARGS () >= 2 ) {
963
+ timezone_obj = * params [1 ];
964
+ }
965
+ fix_datetime_timestamp (& obj , time , timezone_obj TSRMLS_CC );
909
966
}
910
967
911
968
efree (params );
0 commit comments