1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Implement More Appropriate Date/Time Exceptions RFC

This commit is contained in:
Derick Rethans
2023-01-06 15:31:16 +00:00
parent 0cfc45b667
commit b7860cd564
66 changed files with 1489 additions and 261 deletions

3
NEWS
View File

@@ -24,6 +24,9 @@ PHP NEWS
(ilutov)
. Fix bug GH-10083 (Allow comments between & and parameter). (ilutov)
- Date:
. Implement More Appropriate Date/Time Exceptions RFC. (Derick)
- Exif:
. Removed unneeded codepaths in exif_process_TIFF_in_JPEG(). (nielsdos)

View File

@@ -269,6 +269,8 @@ PHP_INI_END()
zend_class_entry *date_ce_date, *date_ce_timezone, *date_ce_interval, *date_ce_period;
zend_class_entry *date_ce_immutable, *date_ce_interface;
zend_class_entry *date_ce_date_error, *date_ce_date_object_error, *date_ce_date_range_error;
zend_class_entry *date_ce_date_exception, *date_ce_date_invalid_timezone_exception, *date_ce_date_invalid_operation_exception, *date_ce_date_malformed_string_exception, *date_ce_date_malformed_interval_string_exception, *date_ce_date_malformed_period_string_exception;
PHPAPI zend_class_entry *php_date_get_date_ce(void)
@@ -307,9 +309,25 @@ static zend_object_handlers date_object_handlers_timezone;
static zend_object_handlers date_object_handlers_interval;
static zend_object_handlers date_object_handlers_period;
#define DATE_CHECK_INITIALIZED(member, class_name) \
static void date_throw_uninitialized_error(zend_class_entry *ce)
{
if (ce->type == ZEND_INTERNAL_CLASS) {
zend_throw_error(date_ce_date_object_error, "Object of type %s has not been correctly initialized by calling parent::__construct() in its constructor", ZSTR_VAL(ce->name));
} else {
zend_class_entry *ce_ptr = ce;
while (ce_ptr && ce_ptr->parent && ce_ptr->type == ZEND_USER_CLASS) {
ce_ptr = ce_ptr->parent;
}
if (ce_ptr->type != ZEND_INTERNAL_CLASS) {
zend_throw_error(date_ce_date_object_error, "Object of type %s not been correctly initialized by calling parent::__construct() in its constructor", ZSTR_VAL(ce->name));
}
zend_throw_error(date_ce_date_object_error, "Object of type %s (inheriting %s) has not been correctly initialized by calling parent::__construct() in its constructor", ZSTR_VAL(ce->name), ZSTR_VAL(ce_ptr->name));
}
}
#define DATE_CHECK_INITIALIZED(member, ce) \
if (!(member)) { \
zend_throw_error(NULL, "The " #class_name " object has not been correctly initialized by its constructor"); \
date_throw_uninitialized_error(ce); \
RETURN_THROWS(); \
}
@@ -561,7 +579,7 @@ PHPAPI timelib_tzinfo *get_timezone_info(void)
tz = guess_timezone(DATE_TIMEZONEDB);
tzi = php_date_parse_tzfile(tz, DATE_TIMEZONEDB);
if (! tzi) {
zend_throw_error(NULL, "Timezone database is corrupt. Please file a bug report as this should never happen");
zend_throw_error(date_ce_date_error, "Timezone database is corrupt. Please file a bug report as this should never happen");
}
return tzi;
}
@@ -1623,7 +1641,7 @@ static void date_period_it_rewind(zend_object_iterator *iter)
timelib_time_dtor(iterator->object->current);
}
if (!iterator->object->start) {
zend_throw_error(NULL, "DatePeriod has not been initialized correctly");
date_throw_uninitialized_error(date_ce_period);
return;
}
@@ -1779,6 +1797,17 @@ static void date_register_classes(void) /* {{{ */
date_object_handlers_period.get_property_ptr_ptr = date_period_get_property_ptr_ptr;
date_object_handlers_period.read_property = date_period_read_property;
date_object_handlers_period.write_property = date_period_write_property;
date_ce_date_error = register_class_DateError(zend_ce_error);
date_ce_date_object_error = register_class_DateObjectError(date_ce_date_error);
date_ce_date_range_error = register_class_DateRangeError(date_ce_date_error);
date_ce_date_exception = register_class_DateException(zend_ce_exception);
date_ce_date_invalid_timezone_exception = register_class_DateInvalidTimeZoneException(date_ce_date_exception);
date_ce_date_invalid_operation_exception = register_class_DateInvalidOperationException(date_ce_date_exception);
date_ce_date_malformed_string_exception = register_class_DateMalformedStringException(date_ce_date_exception);
date_ce_date_malformed_interval_string_exception = register_class_DateMalformedIntervalStringException(date_ce_date_exception);
date_ce_date_malformed_period_string_exception = register_class_DateMalformedPeriodStringException(date_ce_date_exception);
} /* }}} */
static zend_object *date_object_new_date(zend_class_entry *class_type) /* {{{ */
@@ -1830,7 +1859,7 @@ static int date_object_compare_date(zval *d1, zval *d2) /* {{{ */
o2 = Z_PHPDATE_P(d2);
if (!o1->time || !o2->time) {
php_error_docref(NULL, E_WARNING, "Trying to compare an incomplete DateTime or DateTimeImmutable object");
zend_throw_error(date_ce_date_object_error, "Trying to compare an incomplete DateTime or DateTimeImmutable object");
return ZEND_UNCOMPARABLE;
}
if (!o1->time->sse_uptodate) {
@@ -1970,12 +1999,12 @@ static int date_object_compare_timezone(zval *tz1, zval *tz2) /* {{{ */
o2 = Z_PHPTIMEZONE_P(tz2);
if (!o1->initialized || !o2->initialized) {
zend_throw_error(NULL, "Trying to compare uninitialized DateTimeZone objects");
zend_throw_error(date_ce_date_object_error, "Trying to compare uninitialized DateTimeZone objects");
return 1;
}
if (o1->type != o2->type) {
php_error_docref(NULL, E_WARNING, "Trying to compare different kinds of DateTimeZone objects");
zend_throw_error(date_ce_date_exception, "Cannot compare two different kinds of DateTimeZone objects");
return ZEND_UNCOMPARABLE;
}
@@ -2349,8 +2378,8 @@ PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, siz
/* If called from a constructor throw an exception */
if ((flags & PHP_DATE_INIT_CTOR) && err && err->error_count) {
/* spit out the first library error message, at least */
zend_throw_exception_ex(NULL, 0, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
zend_throw_exception_ex(date_ce_date_malformed_string_exception, 0, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
err->error_messages[0].position, err->error_messages[0].character ? err->error_messages[0].character : ' ', err->error_messages[0].message);
}
if (err && err->error_count) {
timelib_time_dtor(dateobj->time);
@@ -2560,7 +2589,7 @@ PHP_METHOD(DateTime, createFromImmutable)
ZEND_PARSE_PARAMETERS_END();
old_obj = Z_PHPDATE_P(datetimeimmutable_object);
DATE_CHECK_INITIALIZED(old_obj->time, DateTimeImmutable);
DATE_CHECK_INITIALIZED(old_obj->time, Z_OBJCE_P(datetimeimmutable_object));
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
new_obj = Z_PHPDATE_P(return_value);
@@ -2581,7 +2610,7 @@ PHP_METHOD(DateTime, createFromInterface)
ZEND_PARSE_PARAMETERS_END();
old_obj = Z_PHPDATE_P(datetimeinterface_object);
DATE_CHECK_INITIALIZED(old_obj->time, DateTimeInterface);
DATE_CHECK_INITIALIZED(old_obj->time, Z_OBJCE_P(datetimeinterface_object));
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
new_obj = Z_PHPDATE_P(return_value);
@@ -2602,7 +2631,7 @@ PHP_METHOD(DateTimeImmutable, createFromMutable)
ZEND_PARSE_PARAMETERS_END();
old_obj = Z_PHPDATE_P(datetime_object);
DATE_CHECK_INITIALIZED(old_obj->time, DateTime);
DATE_CHECK_INITIALIZED(old_obj->time, Z_OBJCE_P(datetime_object));
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
new_obj = Z_PHPDATE_P(return_value);
@@ -2623,7 +2652,7 @@ PHP_METHOD(DateTimeImmutable, createFromInterface)
ZEND_PARSE_PARAMETERS_END();
old_obj = Z_PHPDATE_P(datetimeinterface_object);
DATE_CHECK_INITIALIZED(old_obj->time, DateTimeInterface);
DATE_CHECK_INITIALIZED(old_obj->time, Z_OBJCE_P(datetimeinterface_object));
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
new_obj = Z_PHPDATE_P(return_value);
@@ -2741,7 +2770,7 @@ PHP_METHOD(DateTime, __serialize)
ZEND_PARSE_PARAMETERS_NONE();
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
array_init(return_value);
myht = Z_ARRVAL_P(return_value);
@@ -2761,7 +2790,7 @@ PHP_METHOD(DateTimeImmutable, __serialize)
ZEND_PARSE_PARAMETERS_NONE();
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTimeImmutable);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
array_init(return_value);
myht = Z_ARRVAL_P(return_value);
@@ -3034,7 +3063,7 @@ PHP_FUNCTION(date_format)
RETURN_THROWS();
}
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
RETURN_STR(date_format(format, format_len, dateobj->time, dateobj->time->is_localtime));
}
/* }}} */
@@ -3048,7 +3077,7 @@ static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{
dateobj = Z_PHPDATE_P(object);
if (!(dateobj->time)) {
zend_throw_error(NULL, "The DateTime object has not been correctly initialized by its constructor");
date_throw_uninitialized_error(Z_OBJCE_P(object));
return 0;
}
@@ -3060,7 +3089,9 @@ static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{
if (err && err->error_count) {
/* spit out the first library error message, at least */
php_error_docref(NULL, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify,
err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
err->error_messages[0].position,
err->error_messages[0].character ? err->error_messages[0].character : ' ',
err->error_messages[0].message);
timelib_time_dtor(tmp_time);
return 0;
}
@@ -3131,12 +3162,38 @@ PHP_FUNCTION(date_modify)
}
/* }}} */
/* {{{ */
PHP_METHOD(DateTime, modify)
{
zval *object;
char *modify;
size_t modify_len;
zend_error_handling zeh;
object = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &modify, &modify_len) == FAILURE) {
RETURN_THROWS();
}
zend_replace_error_handling(EH_THROW, date_ce_date_malformed_string_exception, &zeh);
if (!php_date_modify(object, modify, modify_len)) {
zend_restore_error_handling(&zeh);
RETURN_THROWS();
}
zend_restore_error_handling(&zeh);
RETURN_OBJ_COPY(Z_OBJ_P(object));
}
/* }}} */
/* {{{ */
PHP_METHOD(DateTimeImmutable, modify)
{
zval *object, new_object;
char *modify;
size_t modify_len;
zend_error_handling zeh;
object = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &modify, &modify_len) == FAILURE) {
@@ -3144,11 +3201,16 @@ PHP_METHOD(DateTimeImmutable, modify)
}
date_clone_immutable(object, &new_object);
zend_replace_error_handling(EH_THROW, date_ce_date_malformed_string_exception, &zeh);
if (!php_date_modify(&new_object, modify, modify_len)) {
zval_ptr_dtor(&new_object);
RETURN_FALSE;
zend_restore_error_handling(&zeh);
RETURN_THROWS();
}
zend_restore_error_handling(&zeh);
RETURN_OBJ(Z_OBJ(new_object));
}
/* }}} */
@@ -3160,9 +3222,9 @@ static void php_date_add(zval *object, zval *interval, zval *return_value) /* {{
timelib_time *new_time;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
intobj = Z_PHPINTERVAL_P(interval);
DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval);
DATE_CHECK_INITIALIZED(intobj->initialized, Z_OBJCE_P(interval));
if (intobj->civil_or_wall == PHP_DATE_WALL) {
new_time = timelib_add_wall(dateobj->time, intobj->diff);
@@ -3212,9 +3274,9 @@ static void php_date_sub(zval *object, zval *interval, zval *return_value) /* {{
timelib_time *new_time;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
intobj = Z_PHPINTERVAL_P(interval);
DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval);
DATE_CHECK_INITIALIZED(intobj->initialized, Z_OBJCE_P(interval));
if (intobj->diff->have_weekday_relative || intobj->diff->have_special_relative) {
php_error_docref(NULL, E_WARNING, "Only non-special relative time specifications are supported for subtraction");
@@ -3240,6 +3302,23 @@ PHP_FUNCTION(date_sub)
}
php_date_sub(object, interval, return_value);
RETURN_OBJ_COPY(Z_OBJ_P(object));
}
/* }}} */
/* {{{ Subtracts an interval to the current date in object. */
PHP_METHOD(DateTime, sub)
{
zval *object, *interval;
zend_error_handling zeh;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) {
RETURN_THROWS();
}
zend_replace_error_handling(EH_THROW, date_ce_date_invalid_operation_exception, &zeh);
php_date_sub(object, interval, return_value);
zend_restore_error_handling(&zeh);
RETURN_OBJ_COPY(Z_OBJ_P(object));
}
@@ -3249,6 +3328,7 @@ PHP_FUNCTION(date_sub)
PHP_METHOD(DateTimeImmutable, sub)
{
zval *object, *interval, new_object;
zend_error_handling zeh;
object = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &interval, date_ce_interval) == FAILURE) {
@@ -3256,7 +3336,10 @@ PHP_METHOD(DateTimeImmutable, sub)
}
date_clone_immutable(object, &new_object);
zend_replace_error_handling(EH_THROW, date_ce_date_invalid_operation_exception, &zeh);
php_date_sub(&new_object, interval, return_value);
zend_restore_error_handling(&zeh);
RETURN_OBJ(Z_OBJ(new_object));
}
@@ -3299,7 +3382,7 @@ PHP_FUNCTION(date_timezone_get)
RETURN_THROWS();
}
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
if (dateobj->time->is_localtime) {
php_timezone_obj *tzobj;
php_date_instantiate(date_ce_timezone, return_value);
@@ -3317,7 +3400,7 @@ static void php_date_timezone_set(zval *object, zval *timezone_object, zval *ret
php_timezone_obj *tzobj;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
tzobj = Z_PHPTIMEZONE_P(timezone_object);
switch (tzobj->type) {
@@ -3379,7 +3462,7 @@ PHP_FUNCTION(date_offset_get)
RETURN_THROWS();
}
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
if (dateobj->time->is_localtime) {
switch (dateobj->time->zone_type) {
case TIMELIB_ZONETYPE_ID:
@@ -3406,7 +3489,7 @@ static void php_date_time_set(zval *object, zend_long h, zend_long i, zend_long
php_date_obj *dateobj;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
dateobj->time->h = h;
dateobj->time->i = i;
dateobj->time->s = s;
@@ -3454,7 +3537,7 @@ static void php_date_date_set(zval *object, zend_long y, zend_long m, zend_long
php_date_obj *dateobj;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
dateobj->time->y = y;
dateobj->time->m = m;
dateobj->time->d = d;
@@ -3500,7 +3583,7 @@ static void php_date_isodate_set(zval *object, zend_long y, zend_long w, zend_lo
php_date_obj *dateobj;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
dateobj->time->y = y;
dateobj->time->m = 1;
dateobj->time->d = 1;
@@ -3550,7 +3633,7 @@ static void php_date_timestamp_set(zval *object, zend_long timestamp, zval *retu
php_date_obj *dateobj;
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
timelib_unixtime2local(dateobj->time, (timelib_sll)timestamp);
timelib_update_ts(dateobj->time, NULL);
php_date_set_time_fraction(dateobj->time, 0);
@@ -3602,7 +3685,7 @@ PHP_FUNCTION(date_timestamp_get)
RETURN_THROWS();
}
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(object));
if (!dateobj->time->sse_uptodate) {
timelib_update_ts(dateobj->time, NULL);
@@ -3611,7 +3694,7 @@ PHP_FUNCTION(date_timestamp_get)
timestamp = timelib_date_to_int(dateobj->time, &epoch_does_not_fit_in_zend_long);
if (epoch_does_not_fit_in_zend_long) {
zend_value_error("Epoch doesn't fit in a PHP integer");
zend_throw_error(date_ce_date_range_error, "Epoch doesn't fit in a PHP integer");
RETURN_THROWS();
}
@@ -3632,8 +3715,8 @@ PHP_FUNCTION(date_diff)
}
dateobj1 = Z_PHPDATE_P(object1);
dateobj2 = Z_PHPDATE_P(object2);
DATE_CHECK_INITIALIZED(dateobj1->time, DateTimeInterface);
DATE_CHECK_INITIALIZED(dateobj2->time, DateTimeInterface);
DATE_CHECK_INITIALIZED(dateobj1->time, Z_OBJCE_P(object1));
DATE_CHECK_INITIALIZED(dateobj2->time, Z_OBJCE_P(object2));
php_date_instantiate(date_ce_interval, return_value);
interval = Z_PHPINTERVAL_P(return_value);
@@ -3646,34 +3729,42 @@ PHP_FUNCTION(date_diff)
}
/* }}} */
static bool timezone_initialize(php_timezone_obj *tzobj, const char *tz, size_t tz_len) /* {{{ */
static bool timezone_initialize(php_timezone_obj *tzobj, const char *tz, size_t tz_len, char **warning_message) /* {{{ */
{
timelib_time *dummy_t = ecalloc(1, sizeof(timelib_time));
int dst, not_found;
const char *orig_tz = tz;
if (strlen(tz) != tz_len) {
php_error_docref(NULL, E_WARNING, "Timezone must not contain null bytes");
if (warning_message) {
spprintf(warning_message, 0, "Timezone must not contain null bytes");
}
efree(dummy_t);
return false;
}
dummy_t->z = timelib_parse_zone(&tz, &dst, dummy_t, &not_found, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper);
if ((dummy_t->z >= (100 * 60 * 60)) || (dummy_t->z <= (-100 * 60 * 60))) {
php_error_docref(NULL, E_WARNING, "Timezone offset is out of range (%s)", orig_tz);
if (warning_message) {
spprintf(warning_message, 0, "Timezone offset is out of range (%s)", orig_tz);
}
timelib_free(dummy_t->tz_abbr);
efree(dummy_t);
return FAILURE;
return false;
}
dummy_t->dst = dst;
if (!not_found && (*tz != '\0')) {
php_error_docref(NULL, E_WARNING, "Unknown or bad timezone (%s)", orig_tz);
if (warning_message) {
spprintf(warning_message, 0, "Unknown or bad timezone (%s)", orig_tz);
}
timelib_free(dummy_t->tz_abbr);
efree(dummy_t);
return false;
}
if (not_found) {
php_error_docref(NULL, E_WARNING, "Unknown or bad timezone (%s)", orig_tz);
if (warning_message) {
spprintf(warning_message, 0, "Unknown or bad timezone (%s)", orig_tz);
}
efree(dummy_t);
return false;
} else {
@@ -3689,13 +3780,16 @@ PHP_FUNCTION(timezone_open)
{
zend_string *tz;
php_timezone_obj *tzobj;
char *warning_message;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_PATH_STR(tz) /* To prevent null bytes */
ZEND_PARSE_PARAMETERS_END();
tzobj = Z_PHPTIMEZONE_P(php_date_instantiate(date_ce_timezone, return_value));
if (!timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz))) {
if (!timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz), &warning_message)) {
php_error_docref(NULL, E_WARNING, "%s", warning_message);
efree(warning_message);
zval_ptr_dtor(return_value);
RETURN_FALSE;
}
@@ -3707,16 +3801,17 @@ PHP_METHOD(DateTimeZone, __construct)
{
zend_string *tz;
php_timezone_obj *tzobj;
zend_error_handling error_handling;
char *exception_message;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_PATH_STR(tz) /* To prevent null bytes */
ZEND_PARSE_PARAMETERS_END();
zend_replace_error_handling(EH_THROW, NULL, &error_handling);
tzobj = Z_PHPTIMEZONE_P(ZEND_THIS);
timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz));
zend_restore_error_handling(&error_handling);
if (!timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz), &exception_message)) {
zend_throw_exception_ex(date_ce_date_invalid_timezone_exception, 0, "DateTimeZone::__construct(): %s", exception_message);
efree(exception_message);
}
}
/* }}} */
@@ -3737,10 +3832,13 @@ static bool php_date_timezone_initialize_from_hash(zval **return_value, php_time
if (Z_TYPE_P(z_timezone_type) != IS_LONG) {
return false;
}
if (Z_LVAL_P(z_timezone_type) < TIMELIB_ZONETYPE_OFFSET || Z_LVAL_P(z_timezone_type) > TIMELIB_ZONETYPE_ID) {
return false;
}
if (Z_TYPE_P(z_timezone) != IS_STRING) {
return false;
}
return timezone_initialize(*tzobj, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone));
return timezone_initialize(*tzobj, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone), NULL);
} /* }}} */
/* {{{ */
@@ -3759,8 +3857,7 @@ PHP_METHOD(DateTimeZone, __set_state)
php_date_instantiate(date_ce_timezone, return_value);
tzobj = Z_PHPTIMEZONE_P(return_value);
if (!php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht)) {
zend_throw_error(NULL, "Timezone initialization failed");
zval_ptr_dtor(return_value);
zend_throw_error(NULL, "Invalid serialization data for DateTimeZone object");
}
}
/* }}} */
@@ -3779,7 +3876,7 @@ PHP_METHOD(DateTimeZone, __wakeup)
myht = Z_OBJPROP_P(object);
if (!php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht)) {
zend_throw_error(NULL, "Timezone initialization failed");
zend_throw_error(NULL, "Invalid serialization data for DateTimeZone object");
}
}
/* }}} */
@@ -3794,7 +3891,7 @@ PHP_METHOD(DateTimeZone, __serialize)
ZEND_PARSE_PARAMETERS_NONE();
tzobj = Z_PHPTIMEZONE_P(object);
DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
DATE_CHECK_INITIALIZED(tzobj->initialized, Z_OBJCE_P(object));
array_init(return_value);
myht = Z_ARRVAL_P(return_value);
@@ -3861,7 +3958,7 @@ PHP_FUNCTION(timezone_name_get)
RETURN_THROWS();
}
tzobj = Z_PHPTIMEZONE_P(object);
DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
DATE_CHECK_INITIALIZED(tzobj->initialized, Z_OBJCE_P(object));
php_timezone_to_string(tzobj, return_value);
}
/* }}} */
@@ -3903,9 +4000,9 @@ PHP_FUNCTION(timezone_offset_get)
RETURN_THROWS();
}
tzobj = Z_PHPTIMEZONE_P(object);
DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
DATE_CHECK_INITIALIZED(tzobj->initialized, Z_OBJCE_P(object));
dateobj = Z_PHPDATE_P(dateobject);
DATE_CHECK_INITIALIZED(dateobj->time, DateTimeInterface);
DATE_CHECK_INITIALIZED(dateobj->time, Z_OBJCE_P(dateobject));
switch (tzobj->type) {
case TIMELIB_ZONETYPE_ID:
@@ -3936,7 +4033,7 @@ PHP_FUNCTION(timezone_transitions_get)
RETURN_THROWS();
}
tzobj = Z_PHPTIMEZONE_P(object);
DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
DATE_CHECK_INITIALIZED(tzobj->initialized, Z_OBJCE_P(object));
if (tzobj->type != TIMELIB_ZONETYPE_ID) {
RETURN_FALSE;
}
@@ -4069,7 +4166,7 @@ PHP_FUNCTION(timezone_location_get)
RETURN_THROWS();
}
tzobj = Z_PHPTIMEZONE_P(object);
DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
DATE_CHECK_INITIALIZED(tzobj->initialized, Z_OBJCE_P(object));
if (tzobj->type != TIMELIB_ZONETYPE_ID) {
RETURN_FALSE;
}
@@ -4093,23 +4190,23 @@ static bool date_interval_initialize(timelib_rel_time **rt, /*const*/ char *form
timelib_strtointerval(format, format_length, &b, &e, &p, &r, &errors);
if (errors->error_count > 0) {
zend_throw_exception_ex(NULL, 0, "Unknown or bad format (%s)", format);
zend_throw_exception_ex(date_ce_date_malformed_interval_string_exception, 0, "Unknown or bad format (%s)", format);
retval = false;
if (p) {
timelib_rel_time_dtor(p);
}
} else {
if(p) {
if (p) {
*rt = p;
retval = true;
} else {
if(b && e) {
if (b && e) {
timelib_update_ts(b, NULL);
timelib_update_ts(e, NULL);
*rt = timelib_diff(b, e);
retval = true;
} else {
zend_throw_exception_ex(NULL, 0, "Failed to parse interval (%s)", format);
zend_throw_exception_ex(date_ce_date_malformed_interval_string_exception, 0, "Failed to parse interval (%s)", format);
retval = false;
}
}
@@ -4281,8 +4378,7 @@ static void php_date_interval_initialize_from_hash(zval **return_value, php_inte
time = timelib_strtotime(Z_STRVAL_P(date_str), Z_STRLEN_P(date_str), &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper);
if (err->error_count > 0) {
php_error_docref(NULL,
E_WARNING,
zend_throw_error(NULL,
"Unknown or bad format (%s) at position %d (%c) while unserializing: %s",
Z_STRVAL_P(date_str),
err->error_messages[0].position,
@@ -4413,7 +4509,7 @@ PHP_METHOD(DateInterval, __serialize)
ZEND_PARSE_PARAMETERS_NONE();
intervalobj = Z_PHPINTERVAL_P(object);
DATE_CHECK_INITIALIZED(intervalobj->initialized, DateInterval);
DATE_CHECK_INITIALIZED(intervalobj->initialized, Z_OBJCE_P(object));
array_init(return_value);
myht = Z_ARRVAL_P(return_value);
@@ -4494,13 +4590,25 @@ PHP_METHOD(DateInterval, __wakeup)
}
/* }}} */
static void date_interval_instantiate_from_time(zval *return_value, timelib_time *time, zend_string *time_str)
{
php_interval_obj *diobj;
php_date_instantiate(date_ce_interval, return_value);
diobj = Z_PHPINTERVAL_P(return_value);
diobj->diff = timelib_rel_time_clone(&time->relative);
diobj->initialized = 1;
diobj->civil_or_wall = PHP_DATE_CIVIL;
diobj->from_string = true;
diobj->date_string = zend_string_copy(time_str);
}
/* {{{ Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string */
PHP_FUNCTION(date_interval_create_from_date_string)
{
zend_string *time_str = NULL;
timelib_time *time;
timelib_error_container *err = NULL;
php_interval_obj *diobj;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STR(time_str)
@@ -4521,13 +4629,39 @@ PHP_FUNCTION(date_interval_create_from_date_string)
goto cleanup;
}
php_date_instantiate(date_ce_interval, return_value);
diobj = Z_PHPINTERVAL_P(return_value);
diobj->diff = timelib_rel_time_clone(&time->relative);
diobj->initialized = 1;
diobj->civil_or_wall = PHP_DATE_CIVIL;
diobj->from_string = true;
diobj->date_string = zend_string_copy(time_str);
date_interval_instantiate_from_time(return_value, time, time_str);
cleanup:
timelib_time_dtor(time);
timelib_error_container_dtor(err);
}
/* }}} */
/* {{{ Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string */
PHP_METHOD(DateInterval, createFromDateString)
{
zend_string *time_str = NULL;
timelib_time *time;
timelib_error_container *err = NULL;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STR(time_str)
ZEND_PARSE_PARAMETERS_END();
time = timelib_strtotime(ZSTR_VAL(time_str), ZSTR_LEN(time_str), &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper);
if (err->error_count > 0) {
zend_throw_error(date_ce_date_malformed_interval_string_exception, "Unknown or bad format (%s) at position %d (%c): %s", ZSTR_VAL(time_str),
err->error_messages[0].position, err->error_messages[0].character ? err->error_messages[0].character : ' ', err->error_messages[0].message);
goto cleanup;
}
if (time->have_date || time->have_time || time->have_zone) {
zend_throw_error(date_ce_date_malformed_interval_string_exception, "String '%s' contains non-relative elements", ZSTR_VAL(time_str));
goto cleanup;
}
date_interval_instantiate_from_time(return_value, time, time_str);
cleanup:
timelib_time_dtor(time);
@@ -4617,7 +4751,7 @@ PHP_FUNCTION(date_interval_format)
RETURN_THROWS();
}
diobj = Z_PHPINTERVAL_P(object);
DATE_CHECK_INITIALIZED(diobj->initialized, DateInterval);
DATE_CHECK_INITIALIZED(diobj->initialized, Z_OBJCE_P(object));
RETURN_STR(date_interval_format(format, format_len, diobj->diff));
}
@@ -4635,7 +4769,7 @@ static bool date_period_initialize(timelib_time **st, timelib_time **et, timelib
if (errors->error_count > 0) {
retval = false;
zend_throw_exception_ex(NULL, 0, "Unknown or bad format (%s)", format);
zend_throw_exception_ex(date_ce_date_malformed_period_string_exception, 0, "Unknown or bad format (%s)", format);
if (b) {
timelib_time_dtor(b);
}
@@ -4686,19 +4820,19 @@ PHP_METHOD(DatePeriod, __construct)
if (dpobj->start == NULL) {
zend_string *func = get_active_function_or_method_name();
zend_throw_exception_ex(NULL, 0, "%s(): ISO interval must contain a start date, \"%s\" given", ZSTR_VAL(func), isostr);
zend_throw_exception_ex(date_ce_date_malformed_period_string_exception, 0, "%s(): ISO interval must contain a start date, \"%s\" given", ZSTR_VAL(func), isostr);
zend_string_release(func);
RETURN_THROWS();
}
if (dpobj->interval == NULL) {
zend_string *func = get_active_function_or_method_name();
zend_throw_exception_ex(NULL, 0, "%s(): ISO interval must contain an interval, \"%s\" given", ZSTR_VAL(func), isostr);
zend_throw_exception_ex(date_ce_date_malformed_period_string_exception, 0, "%s(): ISO interval must contain an interval, \"%s\" given", ZSTR_VAL(func), isostr);
zend_string_release(func);
RETURN_THROWS();
}
if (dpobj->end == NULL && recurrences == 0) {
zend_string *func = get_active_function_or_method_name();
zend_throw_exception_ex(NULL, 0, "%s(): ISO interval must contain an end date or a recurrence count, \"%s\" given", ZSTR_VAL(func), isostr);
zend_throw_exception_ex(date_ce_date_malformed_period_string_exception, 0, "%s(): ISO interval must contain an end date or a recurrence count, \"%s\" given", ZSTR_VAL(func), isostr);
zend_string_release(func);
RETURN_THROWS();
}
@@ -4740,7 +4874,7 @@ PHP_METHOD(DatePeriod, __construct)
if (dpobj->end == NULL && recurrences < 1) {
zend_string *func = get_active_function_or_method_name();
zend_throw_exception_ex(NULL, 0, "%s(): Recurrence count must be greater than 0", ZSTR_VAL(func));
zend_throw_exception_ex(date_ce_date_malformed_period_string_exception, 0, "%s(): Recurrence count must be greater than 0", ZSTR_VAL(func));
zend_string_release(func);
RETURN_THROWS();
}
@@ -4767,7 +4901,7 @@ PHP_METHOD(DatePeriod, getStartDate)
ZEND_PARSE_PARAMETERS_NONE();
dpobj = Z_PHPPERIOD_P(ZEND_THIS);
DATE_CHECK_INITIALIZED(dpobj->start, DatePeriod);
DATE_CHECK_INITIALIZED(dpobj->start, Z_OBJCE_P(ZEND_THIS));
php_date_instantiate(dpobj->start_ce, return_value);
dateobj = Z_PHPDATE_P(return_value);
@@ -4818,7 +4952,7 @@ PHP_METHOD(DatePeriod, getDateInterval)
ZEND_PARSE_PARAMETERS_NONE();
dpobj = Z_PHPPERIOD_P(ZEND_THIS);
DATE_CHECK_INITIALIZED(dpobj->interval, DatePeriod);
DATE_CHECK_INITIALIZED(dpobj->interval, Z_OBJCE_P(ZEND_THIS));
php_date_instantiate(date_ce_interval, return_value);
diobj = Z_PHPINTERVAL_P(return_value);
@@ -5374,7 +5508,7 @@ PHP_METHOD(DatePeriod, __serialize)
ZEND_PARSE_PARAMETERS_NONE();
period_obj = Z_PHPPERIOD_P(object);
DATE_CHECK_INITIALIZED(period_obj->start, DatePeriod);
DATE_CHECK_INITIALIZED(period_obj->start, Z_OBJCE_P(object));
array_init(return_value);
myht = Z_ARRVAL_P(return_value);

View File

@@ -377,7 +377,6 @@ class DateTime implements DateTimeInterface
/**
* @tentative-return-type
* @alias date_modify
*/
public function modify(string $modifier): DateTime|false {}
@@ -389,7 +388,6 @@ class DateTime implements DateTimeInterface
/**
* @tentative-return-type
* @alias date_sub
*/
public function sub(DateInterval $interval): DateTime {}
@@ -668,7 +666,6 @@ class DateInterval
/**
* @tentative-return-type
* @alias date_interval_create_from_date_string
*/
public static function createFromDateString(string $datetime): DateInterval|false {}
@@ -749,3 +746,66 @@ class DatePeriod implements IteratorAggregate
public function getIterator(): Iterator {}
}
/**
* @strict-properties
*/
class DateError extends Error
{
}
/**
* @strict-properties
*/
class DateObjectError extends DateError
{
}
/**
* @strict-properties
*/
class DateRangeError extends DateRangeError
{
}
/**
* @strict-properties
*/
class DateException extends Exception
{
}
/**
* @strict-properties
*/
class DateInvalidTimeZoneException extends Exception
{
}
/**
* @strict-properties
*/
class DateInvalidOperationException extends DateException
{
}
/**
* @strict-properties
*/
class DateMalformedStringException extends DateException
{
}
/**
* @strict-properties
*/
class DateMalformedIntervalStringException extends DateException
{
}
/**
* @strict-properties
*/
class DateMalformedPeriodStringException extends DateException
{
}

View File

@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 6949e2c795288f9615222b1fd496768ab20eb7c5 */
* Stub hash: ce0bc9fd067a6598f66a65a9159674392e6cac4d */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strtotime, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, datetime, IS_STRING, 0)
@@ -549,6 +549,8 @@ ZEND_METHOD(DateTime, __wakeup);
ZEND_METHOD(DateTime, __set_state);
ZEND_METHOD(DateTime, createFromImmutable);
ZEND_METHOD(DateTime, createFromInterface);
ZEND_METHOD(DateTime, modify);
ZEND_METHOD(DateTime, sub);
ZEND_METHOD(DateTimeImmutable, __construct);
ZEND_METHOD(DateTimeImmutable, __serialize);
ZEND_METHOD(DateTimeImmutable, __unserialize);
@@ -570,6 +572,7 @@ ZEND_METHOD(DateTimeZone, __unserialize);
ZEND_METHOD(DateTimeZone, __wakeup);
ZEND_METHOD(DateTimeZone, __set_state);
ZEND_METHOD(DateInterval, __construct);
ZEND_METHOD(DateInterval, createFromDateString);
ZEND_METHOD(DateInterval, __serialize);
ZEND_METHOD(DateInterval, __unserialize);
ZEND_METHOD(DateInterval, __wakeup);
@@ -663,9 +666,9 @@ static const zend_function_entry class_DateTime_methods[] = {
ZEND_ME_MAPPING(createFromFormat, date_create_from_format, arginfo_class_DateTime_createFromFormat, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_ME_MAPPING(getLastErrors, date_get_last_errors, arginfo_class_DateTime_getLastErrors, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_ME_MAPPING(format, date_format, arginfo_class_DateTime_format, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(modify, date_modify, arginfo_class_DateTime_modify, ZEND_ACC_PUBLIC)
ZEND_ME(DateTime, modify, arginfo_class_DateTime_modify, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(add, date_add, arginfo_class_DateTime_add, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(sub, date_sub, arginfo_class_DateTime_sub, ZEND_ACC_PUBLIC)
ZEND_ME(DateTime, sub, arginfo_class_DateTime_sub, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(getTimezone, date_timezone_get, arginfo_class_DateTime_getTimezone, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(setTimezone, date_timezone_set, arginfo_class_DateTime_setTimezone, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(getOffset, date_offset_get, arginfo_class_DateTime_getOffset, ZEND_ACC_PUBLIC)
@@ -724,7 +727,7 @@ static const zend_function_entry class_DateTimeZone_methods[] = {
static const zend_function_entry class_DateInterval_methods[] = {
ZEND_ME(DateInterval, __construct, arginfo_class_DateInterval___construct, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(createFromDateString, date_interval_create_from_date_string, arginfo_class_DateInterval_createFromDateString, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_ME(DateInterval, createFromDateString, arginfo_class_DateInterval_createFromDateString, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_ME_MAPPING(format, date_interval_format, arginfo_class_DateInterval_format, ZEND_ACC_PUBLIC)
ZEND_ME(DateInterval, __serialize, arginfo_class_DateInterval___serialize, ZEND_ACC_PUBLIC)
ZEND_ME(DateInterval, __unserialize, arginfo_class_DateInterval___unserialize, ZEND_ACC_PUBLIC)
@@ -748,6 +751,51 @@ static const zend_function_entry class_DatePeriod_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateError_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateObjectError_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateRangeError_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateException_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateInvalidTimeZoneException_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateInvalidOperationException_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateMalformedStringException_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateMalformedIntervalStringException_methods[] = {
ZEND_FE_END
};
static const zend_function_entry class_DateMalformedPeriodStringException_methods[] = {
ZEND_FE_END
};
static void register_php_date_symbols(int module_number)
{
REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_RFC3339, CONST_PERSISTENT);
@@ -1083,3 +1131,102 @@ static zend_class_entry *register_class_DatePeriod(zend_class_entry *class_entry
return class_entry;
}
static zend_class_entry *register_class_DateError(zend_class_entry *class_entry_Error)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateError", class_DateError_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateObjectError(zend_class_entry *class_entry_DateError)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateObjectError", class_DateObjectError_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_DateError);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateRangeError(zend_class_entry *class_entry_DateRangeError)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateRangeError", class_DateRangeError_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_DateRangeError);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateException(zend_class_entry *class_entry_Exception)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateException", class_DateException_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateInvalidTimeZoneException(zend_class_entry *class_entry_Exception)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateInvalidTimeZoneException", class_DateInvalidTimeZoneException_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateInvalidOperationException(zend_class_entry *class_entry_DateException)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateInvalidOperationException", class_DateInvalidOperationException_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_DateException);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateMalformedStringException(zend_class_entry *class_entry_DateException)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateMalformedStringException", class_DateMalformedStringException_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_DateException);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateMalformedIntervalStringException(zend_class_entry *class_entry_DateException)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateMalformedIntervalStringException", class_DateMalformedIntervalStringException_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_DateException);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}
static zend_class_entry *register_class_DateMalformedPeriodStringException(zend_class_entry *class_entry_DateException)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "DateMalformedPeriodStringException", class_DateMalformedPeriodStringException_methods);
class_entry = zend_register_internal_class_ex(&ce, class_entry_DateException);
class_entry->ce_flags |= ZEND_ACC_NO_DYNAMIC_PROPERTIES;
return class_entry;
}

View File

@@ -10,9 +10,9 @@ echo $tz->getOffset($dt), "\n";
try {
echo $tz->getOffset(1);
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
3600
DateTimeZone::getOffset(): Argument #1 ($datetime) must be of type DateTimeInterface, int given
TypeError: DateTimeZone::getOffset(): Argument #1 ($datetime) must be of type DateTimeInterface, int given

View File

@@ -0,0 +1,21 @@
--TEST--
DateInterval constructor exceptions
--INI--
date.timezone=Europe/London
--FILE--
<?php
function check(callable $c)
{
try {
var_dump($c());
} catch (\DateMalformedIntervalStringException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
check(fn() => new DateInterval(""));
check(fn() => new DateInterval("2007-05-11T15:30:00Z/"));
?>
--EXPECTF--
DateMalformedIntervalStringException: Unknown or bad format ()
DateMalformedIntervalStringException: Failed to parse interval (2007-05-11T15:30:00Z/)

View File

@@ -0,0 +1,12 @@
--TEST--
Test DateInterval::createFromDateString() function : nonsense data
--FILE--
<?php
try {
$i = DateInterval::createFromDateString("foobar");
} catch (DateMalformedIntervalStringException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
DateMalformedIntervalStringException: Unknown or bad format (foobar) at position 0 (f): The timezone could not be found in the database

View File

@@ -32,7 +32,11 @@ var_dump($d);
echo "\n\nUsed serialised interval:\n";
$now = new DateTimeImmutable("2022-04-22 16:25:11 BST");
var_dump($now->add($e));
var_dump($now->sub($e));
try {
var_dump($now->sub($e));
} catch (DateInvalidOperationException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
Original object:
@@ -84,13 +88,4 @@ object(DateTimeImmutable)#4 (3) {
["timezone"]=>
string(3) "BST"
}
Warning: DateTimeImmutable::sub(): Only non-special relative time specifications are supported for subtraction in %s on line %d
object(DateTimeImmutable)#4 (3) {
["date"]=>
string(26) "2022-04-22 16:25:11.000000"
["timezone_type"]=>
int(2)
["timezone"]=>
string(3) "BST"
}
DateInvalidOperationException: DateTimeImmutable::sub(): Only non-special relative time specifications are supported for subtraction

View File

@@ -0,0 +1,22 @@
--TEST--
DateInterval invalid serialization data with date_string
--FILE--
<?php
$propertySets = [
'2023-01-16 17:01:19',
'2023-01-16-foobar$*',
];
foreach( $propertySets as $propertySet )
{
try {
$d = DateInterval::__set_state( [ 'date_string' => $propertySet ] );
echo "OK\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECT--
OK
Error: Unknown or bad format (2023-01-16-foobar$*) at position 10 (-) while unserializing: Unexpected character

View File

@@ -0,0 +1,30 @@
--TEST--
DateInterval uninitialised exceptions
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDateInterval extends DateInterval
{
function __construct()
{
}
}
function check(callable $c)
{
try {
var_dump($c());
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
$mdi = new MyDateInterval();
check(fn() => serialize($mdi));
check(fn() => $mdi->format("Y-m-d"));
?>
--EXPECTF--
DateObjectError: Object of type MyDateInterval (inheriting DateInterval) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateInterval (inheriting DateInterval) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -0,0 +1,22 @@
--TEST--
DatePeriod by-ref iterator
--FILE--
<?php
$properties = [
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => true,
];
$d = DatePeriod::__set_state( $properties );
try {
foreach( $d as &$item )
{
echo $item->format(DateTime::ISO8601), "\n";
}
echo "OK\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
Error: An iterator cannot be used with foreach by reference

View File

@@ -0,0 +1,25 @@
--TEST--
DatePeriod modify readonly property
--FILE--
<?php
$dp = new \DatePeriod(
new \DateTimeImmutable("2023-01-13"),
DateInterval::createFromDateString('+1 month'),
new \DateTimeImmutable("2023-12-31"),
);
try {
$dp->interval = "foo";
} catch( \Error $e ) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
$foo =& $dp->interval;
} catch( \Error $e ) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
Error: Cannot modify readonly property DatePeriod::$interval
Error: Cannot modify readonly property DatePeriod::$interval

View File

@@ -20,33 +20,33 @@ foreach ($properties as $property) {
try {
$period->$property = "new";
} catch (Error $e) {
echo $e->getMessage() . "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
$period->$property[] = "extra";
} catch (Error $e) {
echo $e->getMessage() . "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
try {
$period->start->modify("+1 hour");
} catch (Error $e) {
echo $e->getMessage() . "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
Cannot modify readonly property DatePeriod::$recurrences
Cannot modify readonly property DatePeriod::$recurrences
Cannot modify readonly property DatePeriod::$include_start_date
Cannot modify readonly property DatePeriod::$include_start_date
Cannot modify readonly property DatePeriod::$start
Cannot modify readonly property DatePeriod::$start
Cannot modify readonly property DatePeriod::$current
Cannot modify readonly property DatePeriod::$current
Cannot modify readonly property DatePeriod::$end
Cannot modify readonly property DatePeriod::$end
Cannot modify readonly property DatePeriod::$interval
Cannot modify readonly property DatePeriod::$interval
Error: Cannot modify readonly property DatePeriod::$recurrences
Error: Cannot modify readonly property DatePeriod::$recurrences
Error: Cannot modify readonly property DatePeriod::$include_start_date
Error: Cannot modify readonly property DatePeriod::$include_start_date
Error: Cannot modify readonly property DatePeriod::$start
Error: Cannot modify readonly property DatePeriod::$start
Error: Cannot modify readonly property DatePeriod::$current
Error: Cannot modify readonly property DatePeriod::$current
Error: Cannot modify readonly property DatePeriod::$end
Error: Cannot modify readonly property DatePeriod::$end
Error: Cannot modify readonly property DatePeriod::$interval
Error: Cannot modify readonly property DatePeriod::$interval

View File

@@ -0,0 +1,65 @@
--TEST--
DatePeriod invalid serialization data
--FILE--
<?php
$propertySets = [
/* Two correct elements */
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => true,
],
[
'start' => null, 'end' => null, 'current' => null,
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => false, 'include_end_date' => false,
],
/* Error situations */
[
'start' => "2023-01-13 12:29:30", 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => true,
],
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => "2023-01-16 16:49:29", 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => true,
],
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => "2023-01-15 00:00:00",
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => true,
],
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => "tomorrow", 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => true,
],
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => -1, 'include_start_date' => true, 'include_end_date' => true,
],
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => "true", 'include_end_date' => true,
],
[
'start' => new \DateTimeImmutable("2023-01-13 12:29:30"), 'end' => new \DateTimeImmutable("2023-01-16 16:49:29"), 'current' => new \DateTimeImmutable("2023-01-15 00:00:00"),
'interval' => DateInterval::createFromDateString("tomorrow"), 'recurrences' => 1, 'include_start_date' => true, 'include_end_date' => "true",
],
];
foreach( $propertySets as $propertySet )
{
try {
$d = DatePeriod::__set_state( $propertySet );
echo "OK\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECT--
OK
OK
Error: Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object

View File

@@ -0,0 +1,45 @@
--TEST--
DateTime uninitialised exceptions
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDatePeriod extends DatePeriod
{
function __construct()
{
}
}
function check(callable $c)
{
try {
var_dump($c());
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
$mdp = new MyDatePeriod();
check(fn() => serialize($mdp));
check(fn() => $mdp->getStartDate());
check(fn() => $mdp->getDateInterval());
check(function() use ($mdp) {
foreach($mdp as $foo)
{
}
});
/* Allowed to be empty */
check(fn() => $mdp->getEndDate());
check(fn() => $mdp->getRecurrences());
?>
--EXPECTF--
DateObjectError: Object of type MyDatePeriod (inheriting DatePeriod) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDatePeriod (inheriting DatePeriod) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDatePeriod (inheriting DatePeriod) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type DatePeriod has not been correctly initialized by calling parent::__construct() in its constructor
NULL
NULL

View File

@@ -0,0 +1,25 @@
--TEST--
DatePeriod arguments/wrong arguments
--FILE--
<?php
$dp = new DatePeriod(new \DateTimeImmutable("2023-01-13 12:29:30"), DateInterval::createFromDateString("tomorrow"), 4);
echo get_class($dp) == 'DatePeriod' ? "OK\n" : "FAIL\n";
$dp = new DatePeriod(new \DateTimeImmutable("2023-01-13 12:29:30"), DateInterval::createFromDateString("tomorrow"), new \DateTimeImmutable("2023-01-16 16:49:29"));
echo get_class($dp) == 'DatePeriod' ? "OK\n" : "FAIL\n";
$dp = new DatePeriod("R4/2012-07-01T00:00:00Z/P7D");
echo get_class($dp) == 'DatePeriod' ? "OK\n" : "FAIL\n";
try {
$dp = new DatePeriod("2023-01-13 17:24:58", DateInterval::createFromDateString("tomorrow"), 4);
echo "OK\n";
} catch (\TypeError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
OK
OK
OK
TypeError: DatePeriod::__construct() accepts (DateTimeInterface, DateInterval, int [, int]), or (DateTimeInterface, DateInterval, DateTime [, int]), or (string [, int]) as arguments

View File

@@ -0,0 +1,37 @@
--TEST--
DateTimeImmutable::createFromInterface exception
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDateTime extends DateTime
{
function __construct()
{
}
}
class MyDateTimeImmutable extends DateTimeImmutable
{
function __construct()
{
}
}
$i = new MyDateTime();
try {
$m = DateTimeImmutable::createFromInterface( $i );
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
$i = new MyDateTimeImmutable();
try {
$m = DateTimeImmutable::createFromInterface( $i );
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -12,7 +12,7 @@ var_dump( $i );
try {
DateTimeImmutable::createFromMutable( date_create_immutable( $current ) );
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
@@ -24,4 +24,4 @@ object(DateTimeImmutable)#%d (3) {
["timezone"]=>
string(13) "Europe/London"
}
DateTimeImmutable::createFromMutable(): Argument #1 ($object) must be of type DateTime, DateTimeImmutable given
TypeError: DateTimeImmutable::createFromMutable(): Argument #1 ($object) must be of type DateTime, DateTimeImmutable given

View File

@@ -14,7 +14,7 @@ var_dump( $i );
try {
MyDateTimeImmutable::createFromMutable( date_create_immutable( $current ) );
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
@@ -26,4 +26,4 @@ object(MyDateTimeImmutable)#%d (3) {
["timezone"]=>
string(13) "Europe/London"
}
DateTimeImmutable::createFromMutable(): Argument #1 ($object) must be of type DateTime, DateTimeImmutable given
TypeError: DateTimeImmutable::createFromMutable(): Argument #1 ($object) must be of type DateTime, DateTimeImmutable given

View File

@@ -0,0 +1,23 @@
--TEST--
DateTimeImmutable::createFromMutable exception
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDateTime extends DateTime
{
function __construct()
{
}
}
$i = new MyDateTime();
try {
$m = DateTimeImmutable::createFromMutable( $i );
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -4,9 +4,12 @@ DateTimeImmutable::modify() with invalid format
<?php
$datetime = new DateTimeImmutable;
var_dump($datetime->modify(''));
try {
var_dump($datetime->modify(''));
} catch (DateMalformedStringException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
Warning: DateTimeImmutable::modify(): Failed to parse time string () at position 0 ( in %s on line %d
bool(false)
DateMalformedStringException: DateTimeImmutable::modify(): Failed to parse time string () at position 0 ( ): Empty string

View File

@@ -0,0 +1,38 @@
--TEST--
DateTimeImmutable invalid serialization data
--FILE--
<?php
$propertySets = [
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 1, 'timezone' => "+02:30" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3, 'timezone' => "Europe/Kyiv" ],
[ 'date' => 2023.113, 'timezone_type' => 1, 'timezone' => "+02:30" ],
[ 'date' => 2023.113, 'timezone_type' => 3, 'timezone' => "Europe/Kyiv" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 1.4, 'timezone' => "+02:30" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3.4, 'timezone' => "Europe/Kyiv" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 1, 'timezone' => 2.5 ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3, 'timezone' => 2.5 ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3, 'timezone' => "Europe/Lviv" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 4, 'timezone' => "Europe/Kyiv" ],
];
foreach( $propertySets as $propertySet )
{
try {
$d = DateTimeImmutable::__set_state( $propertySet );
echo "OK\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECT--
OK
OK
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object
Error: Invalid serialization data for DateTimeImmutable object

View File

@@ -0,0 +1,79 @@
--TEST--
DateTime uninitialised exceptions
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDateTimeImmutable extends DateTimeImmutable
{
function __construct()
{
}
}
function check(callable $c)
{
try {
var_dump($c());
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
$mdti = new MyDateTimeImmutable();
$dt = new DateTimeImmutable();
$di = DateInterval::createFromDateString("tomorrow");
$dtz = new DateTimeZone("Europe/Kyiv");
check(fn() => DateTimeImmutable::createFromInterface($mdti));
check(fn() => DateTime::createFromImmutable($mdti));
check(fn() => serialize($mdti));
check(fn() => date_format($mdti, DateTime::ISO8601));
check(fn() => $mdti->format(DateTime::ISO8601));
check(fn() => $mdti->modify("+1 day"));
check(fn() => $mdti->add($di));
check(fn() => $mdti->sub($di));
check(fn() => date_timezone_get($mdti));
check(fn() => $mdti->getTimeZone());
check(fn() => $mdti->setTimeZone($dtz));
check(fn() => date_offset_get($mdti));
check(fn() => $mdti->getOffset());
check(fn() => $mdti->setTime(17, 59, 53));
check(fn() => $mdti->setDate(2023, 1, 16));
check(fn() => $mdti->setISODate(2023, 3, 1));
check(fn() => $mdti->setTimestamp(time()));
check(fn() => date_timestamp_get($mdti));
check(fn() => $mdti->getTimestamp());
check(fn() => date_diff($dt, $mdti));
check(fn() => date_diff($mdti, $dt));
check(fn() => date_diff($mdti, $mdti));
check(fn() => $dt->diff($mdti));
check(fn() => $mdti->diff($dt));
check(fn() => $mdti->diff($mdti));
?>
--EXPECTF--
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeImmutable (inheriting DateTimeImmutable) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -0,0 +1,46 @@
--TEST--
DateTimeZone compare handler
--FILE--
<?php
class MyDateTimeZone extends DateTimeZone
{
function __construct()
{
}
}
$mdtz = new MyDateTimeZone();
$dtzID = new DateTimeZone("Europe/Kyiv");
$dtzAbbr = new DateTimeZone("CEST");
$dtzUTC = new DateTimeZone("-5:00");
try {
var_dump($mdtz < $dtzID);
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($dtzID < $mdtz);
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($dtzID < $dtzAbbr);
} catch (\DateException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($dtzAbbr < $dtzUTC);
} catch (\DateException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
DateObjectError: Trying to compare uninitialized DateTimeZone objects
DateObjectError: Trying to compare uninitialized DateTimeZone objects
DateException: Cannot compare two different kinds of DateTimeZone objects
DateException: Cannot compare two different kinds of DateTimeZone objects

View File

@@ -14,7 +14,11 @@ foreach ($timezones as [$timezone1, $timezone2]) {
compare_timezones($timezone1, $timezone2);
}
var_dump(new DateTimeZone('Europe/Berlin') == new DateTimeZone('CET'));
try {
var_dump(new DateTimeZone('Europe/Berlin') == new DateTimeZone('CET'));
} catch (DateException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
function compare_timezones($timezone1, $timezone2)
{
@@ -41,7 +45,7 @@ $tz2 = new MyDateTimeZone();
try {
var_dump($tz1 == $tz2);
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
@@ -70,7 +74,5 @@ compare Europe/Amsterdam with Europe/Berlin
< bool(false)
= bool(false)
> bool(false)
Warning: main(): Trying to compare different kinds of DateTimeZone objects in %s on line %d
bool(false)
Trying to compare uninitialized DateTimeZone objects
DateException: Cannot compare two different kinds of DateTimeZone objects
DateObjectError: Trying to compare uninitialized DateTimeZone objects

View File

@@ -1,9 +1,9 @@
--TEST--
Test new DateTimeZone() : error conditions
Test new DateTimeZone(): Too few arguments
--FILE--
<?php
//Set the default time zone
date_default_timezone_set("GMT");
// Set the default time zone
date_default_timezone_set("UTC");
echo "*** Testing DateTimeZone() : error conditions ***\n";
@@ -12,8 +12,8 @@ $timezone = "GMT";
$extra_arg = 99;
try {
new DateTimeZone($timezone, $extra_arg);
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
} catch (ArgumentCountError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
@@ -21,4 +21,4 @@ try {
*** Testing DateTimeZone() : error conditions ***
-- Testing new DateTimeZone() with more than expected no. of arguments --
DateTimeZone::__construct() expects exactly 1 argument, 2 given
ArgumentCountError: DateTimeZone::__construct() expects exactly 1 argument, 2 given

View File

@@ -7,9 +7,8 @@ $serialized = 'O:12:"DateTimeZone":2:{s:13:"timezone_type";i:3;s:8:"timezone";s:
try {
$tz = unserialize($serialized);
} catch (Throwable $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
Warning: DateTimeZone::__unserialize(): Timezone must not contain null bytes in %s on line %d
Invalid serialization data for DateTimeZone object
--EXPECT--
Error: Invalid serialization data for DateTimeZone object

View File

@@ -0,0 +1,38 @@
--TEST--
DateTimeZone invalid serialization data
--FILE--
<?php
$propertySets = [
[ 'timezone_type' => 1, 'timezone' => "+02:30" ],
[ 'timezone_type' => 3, 'timezone' => "Europe/Kyiv" ],
[ 'timezone_type' => 1.4, 'timezone' => "+02:30" ],
[ 'timezone_type' => 3.4, 'timezone' => "Europe/Kyiv" ],
[ 'timezone_type' => 1, 'timezone' => 2.5 ],
[ 'timezone_type' => 3, 'timezone' => 2.5 ],
[ 'timezone_type' => 3, 'timezone' => "Europe/K\0v" ],
[ 'timezone_type' => 3, 'timezone' => "99:99:99" ],
[ 'timezone_type' => 3, 'timezone' => "Europe/Lviv" ],
[ 'timezone_type' => 4, 'timezone' => "Europe/Kyiv" ],
];
foreach( $propertySets as $propertySet )
{
try {
$d = DateTimeZone::__set_state( $propertySet );
echo "OK\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECT--
OK
OK
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object
Error: Invalid serialization data for DateTimeZone object

View File

@@ -0,0 +1,58 @@
--TEST--
DateTime uninitialised exceptions
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDateTime extends DateTime
{
function __construct()
{
}
}
class MyDateTimeZone extends DateTimeZone
{
function __construct()
{
}
}
function check(callable $c)
{
try {
var_dump($c());
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
$mdt = new MyDateTime();
$mdtz = new MyDateTimeZone();
$dtz = new DateTimeZone("Europe/Kyiv");
$dt = new DateTime("2023-01-16 18:18");
check(fn() => serialize($mdtz));
check(fn() => timezone_name_get($mdtz));
check(fn() => $mdtz->getName());
check(fn() => timezone_offset_get($mdtz, $dt));
check(fn() => $mdtz->getOffset($dt));
check(fn() => timezone_offset_get($dtz, $mdt));
check(fn() => $dtz->getOffset($mdt));
check(fn() => timezone_transitions_get($mdtz, time()));
check(fn() => $mdtz->getTransitions(time()));
check(fn() => timezone_location_get($mdtz,));
check(fn() => $mdtz->getLocation());
?>
--EXPECTF--
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -0,0 +1,48 @@
--TEST--
DateTime/DateTimeImmutable compare handler
--FILE--
<?php
class MyDateTime extends DateTime
{
function __construct()
{
}
}
$DT = new DateTime("2023-01-16 17:09:08");
$DTI = new DateTimeImmutable("2023-01-16 17:09:08");
$MDT = new MyDateTime();
var_dump($DT < $DTI);
try {
var_dump($DT < $MDT);
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($MDT < $DT);
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($DTI < $MDT);
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($MDT < $DTI);
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
bool(false)
DateObjectError: Trying to compare an incomplete DateTime or DateTimeImmutable object
DateObjectError: Trying to compare an incomplete DateTime or DateTimeImmutable object
DateObjectError: Trying to compare an incomplete DateTime or DateTimeImmutable object
DateObjectError: Trying to compare an incomplete DateTime or DateTimeImmutable object

View File

@@ -1,9 +1,9 @@
--TEST--
Test new DateTime() : error conditions
Test new DateTime(): error conditions
--FILE--
<?php
//Set the default time zone
date_default_timezone_set("GMT");
// Set the default time zone
date_default_timezone_set('UTC');
echo "*** Testing date_create() : error conditions ***\n";
@@ -12,9 +12,9 @@ $time = "GMT";
$timezone = timezone_open("GMT");
$extra_arg = 99;
try {
var_dump( new DateTime($time, $timezone, $extra_arg) );
var_dump(new DateTime($time, $timezone, $extra_arg));
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
@@ -22,4 +22,4 @@ try {
*** Testing date_create() : error conditions ***
-- Testing new DateTime() with more than expected no. of arguments --
DateTime::__construct() expects at most 2 arguments, 3 given
ArgumentCountError: DateTime::__construct() expects at most 2 arguments, 3 given

View File

@@ -17,7 +17,7 @@ var_dump( $i->format('Y-m-d H:i:s') === $current );
try {
DateTime::createFromImmutable( date_create( $current ) );
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
@@ -30,4 +30,4 @@ object(DateTime)#%d (3) {
string(13) "Europe/London"
}
bool(true)
DateTime::createFromImmutable(): Argument #1 ($object) must be of type DateTimeImmutable, DateTime given
TypeError: DateTime::createFromImmutable(): Argument #1 ($object) must be of type DateTimeImmutable, DateTime given

View File

@@ -19,7 +19,7 @@ var_dump( $i->format('Y-m-d H:i:s') === $current );
try {
MyDateTime::createFromImmutable( date_create( $current ) );
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
@@ -32,4 +32,4 @@ object(MyDateTime)#%d (3) {
string(13) "Europe/London"
}
bool(true)
DateTime::createFromImmutable(): Argument #1 ($object) must be of type DateTimeImmutable, DateTime given
TypeError: DateTime::createFromImmutable(): Argument #1 ($object) must be of type DateTimeImmutable, DateTime given

View File

@@ -0,0 +1,18 @@
--TEST--
DateTime::modify() with empty string as format
--FILE--
<?php
$datetime = new DateTime;
var_dump(date_modify($datetime, ''));
try {
var_dump($datetime->modify(''));
} catch (DateMalformedStringException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
Warning: date_modify(): Failed to parse time string () at position 0 ( ): Empty string in %s
bool(false)
DateMalformedStringException: DateTime::modify(): Failed to parse time string () at position 0 ( ): Empty string

View File

@@ -0,0 +1,40 @@
--TEST--
DateTime invalid serialization data
--FILE--
<?php
$propertySets = [
/* Two correct ones */
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 1, 'timezone' => "+02:30" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3, 'timezone' => "Europe/Kyiv" ],
/* Error situations */
[ 'date' => 2023.113, 'timezone_type' => 1, 'timezone' => "+02:30" ],
[ 'date' => 2023.113, 'timezone_type' => 3, 'timezone' => "Europe/Kyiv" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 1.4, 'timezone' => "+02:30" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3.4, 'timezone' => "Europe/Kyiv" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 1, 'timezone' => 2.5 ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3, 'timezone' => 2.5 ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 3, 'timezone' => "Europe/Lviv" ],
[ 'date' => "2023-01-13 12:29:30", 'timezone_type' => 4, 'timezone' => "Europe/Kyiv" ],
];
foreach( $propertySets as $propertySet )
{
try {
$d = DateTime::__set_state( $propertySet );
echo "OK\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECT--
OK
OK
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object

View File

@@ -0,0 +1,91 @@
--TEST--
DateTime uninitialised exceptions
--INI--
date.timezone=Europe/London
--FILE--
<?php
class MyDateTime extends DateTime
{
function __construct()
{
}
}
function check(callable $c)
{
try {
var_dump($c());
} catch (\DateObjectError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
$mdt = new MyDateTime();
$dt = new DateTime();
$di = DateInterval::createFromDateString("tomorrow");
$dtz = new DateTimeZone("Europe/Kyiv");
check(fn() => DateTime::createFromInterface($mdt));
check(fn() => DateTimeImmutable::createFromMutable($mdt));
check(fn() => serialize($mdt));
check(fn() => date_format($mdt, DateTime::ISO8601));
check(fn() => $mdt->format(DateTime::ISO8601));
check(fn() => date_modify($mdt, "+1 day"));
check(fn() => $mdt->modify("+1 day"));
check(fn() => $mdt->add($di));
check(fn() => $mdt->sub($di));
check(fn() => date_timezone_get($mdt));
check(fn() => $mdt->getTimeZone());
check(fn() => date_timezone_set($mdt, $dtz));
check(fn() => $mdt->setTimeZone($dtz));
check(fn() => date_offset_get($mdt));
check(fn() => $mdt->getOffset());
check(fn() => date_time_set($mdt, 17, 59, 53));
check(fn() => $mdt->setTime(17, 59, 53));
check(fn() => date_date_set($mdt, 2023, 1, 16));
check(fn() => $mdt->setDate(2023, 1, 16));
check(fn() => date_isodate_set($mdt, 2023, 3, 1));
check(fn() => $mdt->setISODate(2023, 3, 1));
check(fn() => date_timestamp_set($mdt, time()));
check(fn() => $mdt->setTimestamp(time()));
check(fn() => date_timestamp_get($mdt));
check(fn() => $mdt->getTimestamp());
check(fn() => date_diff($dt, $mdt));
check(fn() => date_diff($mdt, $dt));
check(fn() => date_diff($mdt, $mdt));
check(fn() => $dt->diff($mdt));
check(fn() => $mdt->diff($dt));
check(fn() => $mdt->diff($mdt));
?>
--EXPECTF--
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -0,0 +1,34 @@
--TEST--
DateTime invalid serialization data (wakeup)
--FILE--
<?php
$propertySets = [
'O:8:"DateTime":3:{s:4:"date";s:26:"2023-01-13 14:48:01.705516";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/London";}',
'O:8:"DateTime":3:{s:4:"date";i:3;s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}',
'O:8:"DateTime":3:{s:4:"date";s:26:"2023-01-13 14:48:01.705516";s:13:"timezone_type";s:1:"X";s:8:"timezone";s:3:"UTC";}',
'O:8:"DateTime":3:{s:4:"date";s:26:"2023-01-13 14:48:01.705516";s:13:"timezone_type";i:4;s:8:"timezone";s:3:"UTC";}',
'O:8:"DateTime":3:{s:4:"date";s:26:"2023-01-13 14:48:01.705516";s:13:"timezone_type";i:3;s:8:"timezone";s:11:"Europe/Lviv";}',
'O:8:"DateTime":3:{s:4:"date";s:26:"2023-01-13 14:48:01.705516";s:13:"timezone_type";i:3;s:8:"timezone";s:11:"Europe/Kyiv";}',
'O:8:"DateTime":3:{s:4:"date";s:26:"2023-01-13 14:48:01.705516";s:13:"timezone_type";i:3;s:8:"timezone";s:1:"Europe/Kyiv";}',
];
foreach( $propertySets as $propertySet )
{
try {
$d = unserialize($propertySet);
echo "OK? ", gettype($d), "\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECTF--
OK? object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
Error: Invalid serialization data for DateTime object
OK? object
Warning: unserialize(): Error at offset 109 of 122 bytes in %sDateTime_wakeup_exception.php on line 15
OK? boolean

View File

@@ -44,7 +44,7 @@ try {
?>
--EXPECTF--
The DateTime object has not been correctly initialized by its constructor
The DateTimeInterface object has not been correctly initialized by its constructor
The DateTimeImmutable object has not been correctly initialized by its constructor
The DateTimeInterface object has not been correctly initialized by its constructor
Object of type DateTime has not been correctly initialized by calling parent::__construct() in its constructor
Object of type DateTime has not been correctly initialized by calling parent::__construct() in its constructor
Object of type DateTimeImmutable has not been correctly initialized by calling parent::__construct() in its constructor
Object of type DateTimeImmutable has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -11,18 +11,18 @@ foreach ( [ '+99:60', '+99:62', '-99:62', '-99:60', '+9960', '-9960', '+9959', '
$d = new DateTimeZone($test);
echo $d->getName(), "\n";
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
?>
--EXPECT--
Testing +99:60: DateTimeZone::__construct(): Timezone offset is out of range (+99:60)
Testing +99:62: DateTimeZone::__construct(): Timezone offset is out of range (+99:62)
Testing -99:62: DateTimeZone::__construct(): Timezone offset is out of range (-99:62)
Testing -99:60: DateTimeZone::__construct(): Timezone offset is out of range (-99:60)
Testing +9960: DateTimeZone::__construct(): Timezone offset is out of range (+9960)
Testing -9960: DateTimeZone::__construct(): Timezone offset is out of range (-9960)
Testing +99:60: DateInvalidTimeZoneException: DateTimeZone::__construct(): Timezone offset is out of range (+99:60)
Testing +99:62: DateInvalidTimeZoneException: DateTimeZone::__construct(): Timezone offset is out of range (+99:62)
Testing -99:62: DateInvalidTimeZoneException: DateTimeZone::__construct(): Timezone offset is out of range (-99:62)
Testing -99:60: DateInvalidTimeZoneException: DateTimeZone::__construct(): Timezone offset is out of range (-99:60)
Testing +9960: DateInvalidTimeZoneException: DateTimeZone::__construct(): Timezone offset is out of range (+9960)
Testing -9960: DateInvalidTimeZoneException: DateTimeZone::__construct(): Timezone offset is out of range (-9960)
Testing +9959: +99:59
Testing -9959: -99:59

View File

@@ -9,8 +9,8 @@ $start = microtime(true);
try {
$a = mktime(1, 1, 1, 1, 1, 11111111111);
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
mktime(): Argument #6 ($year) must be of type ?int, float given
TypeError: mktime(): Argument #6 ($year) must be of type ?int, float given

View File

@@ -7,7 +7,7 @@ date_default_timezone_set('Europe/Oslo');
try {
$dp = new DatePeriod('2D');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
$begin = new DateTime( "2008-07-20T22:44:53+0200" );
@@ -21,7 +21,7 @@ foreach ( $dp as $d )
?>
--EXPECT--
Unknown or bad format (2D)
DateMalformedPeriodStringException: Unknown or bad format (2D)
string(24) "2008-07-20T22:44:53+0200"
string(24) "2008-07-21T22:44:53+0200"
string(24) "2008-07-22T22:44:53+0200"

View File

@@ -13,12 +13,15 @@ $date->modify( "61538461538 day" );
echo $date->format( 'r' ), "\n";
$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
$date->modify( "£61538461538 day" );
try {
$date->modify( "£61538461538 day" );
} catch (DateMalformedStringException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
echo $date->format( 'r' ), "\n";
?>
--EXPECTF--
Thu, 14 Aug 168488594 16:44:23 +0100
Thu, 14 Aug 168488594 16:44:23 +0100
Warning: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character in %sbug45866.php on line 11
DateMalformedStringException: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character
Wed, 29 Jul 2009 16:44:23 +0100

View File

@@ -13,14 +13,14 @@ $o = new MyDateTime;
try {
var_dump($o->format("d"));
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
$x = clone $o;
try {
var_dump($x->format("d"));
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
clone $o;
@@ -28,10 +28,10 @@ clone $o;
try {
var_dump(timezone_location_get(clone new MyDateTimezone));
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
The DateTime object has not been correctly initialized by its constructor
The DateTime object has not been correctly initialized by its constructor
The DateTimeZone object has not been correctly initialized by its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTime (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type MyDateTimeZone (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor

View File

@@ -23,8 +23,8 @@ date_sub($ds2, $i);
2010-03-07T13:21:38+0000
2010-04-20T13:21:38+0000
Warning: date_sub(): Only non-special relative time specifications are supported for subtraction in %sbug50055.php on line 9
Warning: date_sub(): Only non-special relative time specifications are supported for subtraction in %s
2010-03-07T13:21:38+0000
2010-02-16T13:21:38+0000
Warning: date_sub(): Only non-special relative time specifications are supported for subtraction in %sbug50055.php on line 17
Warning: date_sub(): Only non-special relative time specifications are supported for subtraction in %s

View File

@@ -0,0 +1,36 @@
--TEST--
Bug #50555 (DateTime::sub() allows 'relative' time modifications) (OO).
--FILE--
<?php
$now = '2010-03-07 13:21:38 UTC';
//positive DateInterval
$da1 = date_create( $now );
$ds1 = date_create( $now );
$i = DateInterval::createFromDateString('third Tuesday of next month');
echo $da1->format( DateTime::ISO8601 ), "\n";
echo date_add($da1, $i)->format( DateTime::ISO8601 ), "\n";
try {
$ds1->sub($i);
} catch (DateInvalidOperationException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
//negative DateInterval
$da2 = date_create( $now );
$ds2 = date_create( $now );
$i2 = DateInterval::createFromDateString('third Tuesday of last month');
echo $da2->format( DateTime::ISO8601 ), "\n";
echo date_add($da2, $i2)->format( DateTime::ISO8601 ), "\n";//works
try {
$ds2->sub($i);
} catch (DateInvalidOperationException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--
2010-03-07T13:21:38+0000
2010-04-20T13:21:38+0000
DateInvalidOperationException: DateTime::sub(): Only non-special relative time specifications are supported for subtraction
2010-03-07T13:21:38+0000
2010-02-16T13:21:38+0000
DateInvalidOperationException: DateTime::sub(): Only non-special relative time specifications are supported for subtraction

View File

@@ -12,21 +12,21 @@ $d = new DateTime('@100000000000');
var_dump($d->format('Y-m-d H:i:s U'));
try {
var_dump($d->getTimestamp());
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
} catch (\DateRangeError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
var_dump($d->format('U'));
try {
$d->setTimestamp(100000000000);
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
var_dump($d->format('Y-m-d H:i:s U'));
try {
var_dump($d->getTimestamp());
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
} catch (\DateRangeError $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
$i = new DateInterval('PT100000000000S');
@@ -34,9 +34,9 @@ var_dump($i->format('%s'));
?>
--EXPECT--
string(32) "5138-11-16 09:46:40 100000000000"
Epoch doesn't fit in a PHP integer
DateRangeError: Epoch doesn't fit in a PHP integer
string(12) "100000000000"
DateTime::setTimestamp(): Argument #1 ($timestamp) must be of type int, float given
TypeError: DateTime::setTimestamp(): Argument #1 ($timestamp) must be of type int, float given
string(32) "5138-11-16 09:46:40 100000000000"
Epoch doesn't fit in a PHP integer
DateRangeError: Epoch doesn't fit in a PHP integer
string(10) "1215752192"

View File

@@ -4,9 +4,11 @@ Bug #52808 (Segfault when specifying interval as two dates)
<?php
date_default_timezone_set('Europe/Oslo');
$intervals = array(
/* Three correct sets*/
"2008-05-11T15:30:00Z/2007-03-01T13:00:00Z",
"2007-05-11T15:30:00Z/2008-03-01T13:00:00Z",
"2007-05-11T15:30:00Z 2008-03-01T13:00:00Z",
/* Error situations */
"2007-05-11T15:30:00Z/",
"2007-05-11T15:30:00Z",
"2007-05-11T15:30:00Z/:00Z",
@@ -17,9 +19,9 @@ foreach($intervals as $iv) {
$di = new DateInterval($iv);
var_dump($di);
}
catch ( Exception $e )
catch ( \DateMalformedIntervalStringException $e )
{
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
echo "==DONE==\n";
@@ -91,7 +93,7 @@ object(DateInterval)#%d (%d) {
["from_string"]=>
bool(false)
}
Failed to parse interval (2007-05-11T15:30:00Z/)
Failed to parse interval (2007-05-11T15:30:00Z)
Unknown or bad format (2007-05-11T15:30:00Z/:00Z)
DateMalformedIntervalStringException: Failed to parse interval (2007-05-11T15:30:00Z/)
DateMalformedIntervalStringException: Failed to parse interval (2007-05-11T15:30:00Z)
DateMalformedIntervalStringException: Unknown or bad format (2007-05-11T15:30:00Z/:00Z)
==DONE==

View File

@@ -23,7 +23,7 @@ class mydt extends datetime
new mydt("Funktionsansvarig rådgivning och juridik", "UTC");
?>
--EXPECTF--
Fatal error: Uncaught Error: The DateTime object has not been correctly initialized by its constructor in %s:%d
Fatal error: Uncaught DateObjectError: Object of type mydt (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor in %s:%d
Stack trace:
#0 %s(%d): DateTime->format('Y')
#1 %s(%d): mydt->__construct(%s)

View File

@@ -6,8 +6,8 @@ $d = new DateTime('2011-01-15 00:00:00');
try {
var_dump(strtotime('-1 month', $d));
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
strtotime(): Argument #2 ($baseTimestamp) must be of type ?int, DateTime given
TypeError: strtotime(): Argument #2 ($baseTimestamp) must be of type ?int, DateTime given

View File

@@ -6,14 +6,14 @@ $timezone = "Europe/Zurich\0Foo";
try {
var_dump(timezone_open($timezone));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump(new DateTimeZone($timezone));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
timezone_open(): Argument #1 ($timezone) must not contain any null bytes
DateTimeZone::__construct(): Argument #1 ($timezone) must not contain any null bytes
ValueError: timezone_open(): Argument #1 ($timezone) must not contain any null bytes
ValueError: DateTimeZone::__construct(): Argument #1 ($timezone) must not contain any null bytes

View File

@@ -8,7 +8,7 @@ ini_set('date.timezone', 'dummy');
try {
$dt = new DateTime('now');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECTF--

View File

@@ -16,7 +16,7 @@ foreach (new aaa($start) as $y) {
?>
==DONE==
--EXPECTF--
Fatal error: Uncaught Error: DatePeriod has not been initialized correctly in %sbug75002.php:%d
Fatal error: Uncaught DateObjectError: Object of type DatePeriod has not been correctly initialized by calling parent::__construct() in its constructor in %sbug75002.php:%d
Stack trace:
#0 {main}
thrown in %sbug75002.php on line %d

View File

@@ -20,8 +20,8 @@ foreach ($strings as $string)
try {
$tz = new \DateTimeZone($string);
} catch (Exception $e) {
echo $e->getMessage(), "\n";
} catch (DateInvalidTimeZoneException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
echo "\n\n";
@@ -41,33 +41,33 @@ Parsing 'x UTC':
Warning: timezone_open(): Unknown or bad timezone (x UTC) in %sbug78139.php on line %d
bool(false)
DateTimeZone::__construct(): Unknown or bad timezone (x UTC)
DateInvalidTimeZoneException: DateTimeZone::__construct(): Unknown or bad timezone (x UTC)
Parsing 'xx UTC':
Warning: timezone_open(): Unknown or bad timezone (xx UTC) in %sbug78139.php on line %d
bool(false)
DateTimeZone::__construct(): Unknown or bad timezone (xx UTC)
DateInvalidTimeZoneException: DateTimeZone::__construct(): Unknown or bad timezone (xx UTC)
Parsing 'xUTC':
Warning: timezone_open(): Unknown or bad timezone (xUTC) in %sbug78139.php on line %d
bool(false)
DateTimeZone::__construct(): Unknown or bad timezone (xUTC)
DateInvalidTimeZoneException: DateTimeZone::__construct(): Unknown or bad timezone (xUTC)
Parsing 'UTCx':
Warning: timezone_open(): Unknown or bad timezone (UTCx) in %sbug78139.php on line %d
bool(false)
DateTimeZone::__construct(): Unknown or bad timezone (UTCx)
DateInvalidTimeZoneException: DateTimeZone::__construct(): Unknown or bad timezone (UTCx)
Parsing 'UTC xx':
Warning: timezone_open(): Unknown or bad timezone (UTC xx) in %sbug78139.php on line %d
bool(false)
DateTimeZone::__construct(): Unknown or bad timezone (UTC xx)
DateInvalidTimeZoneException: DateTimeZone::__construct(): Unknown or bad timezone (UTC xx)

View File

@@ -6,23 +6,23 @@ DateInterval with bad format should not leak period
try {
new DateInterval('P3"D');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
new DatePeriod('P3"D');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
new DatePeriod('2008-03-01T12:00:00Z1');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
Unknown or bad format (P3"D)
Unknown or bad format (P3"D)
Unknown or bad format (2008-03-01T12:00:00Z1)
DateMalformedIntervalStringException: Unknown or bad format (P3"D)
DateMalformedPeriodStringException: Unknown or bad format (P3"D)
DateMalformedPeriodStringException: Unknown or bad format (2008-03-01T12:00:00Z1)

View File

@@ -6,5 +6,5 @@ $i = date_interval_create_from_date_string("foobar");
var_dump($i);
?>
--EXPECTF--
Warning: date_interval_create_from_date_string(): Unknown or bad format (foobar) at position 0 (f): The timezone could not be found in the database in %sdate_interval_create_from_date_string_broken.php on line 2
Warning: date_interval_create_from_date_string(): Unknown or bad format (foobar) at position 0 (f): The timezone could not be found in the database in %s
bool(false)

View File

@@ -10,5 +10,5 @@ var_dump($i);
--EXPECTF--
Deprecated: date_interval_create_from_date_string(): Passing null to parameter #1 ($datetime) of type string is deprecated in %s on line %d
Warning: date_interval_create_from_date_string(): Unknown or bad format () at position 0 ( ): Empty string in %sdate_interval_create_from_date_string_nullparam.php on line 2
Warning: date_interval_create_from_date_string(): Unknown or bad format () at position 0 ( ): Empty string in %s
bool(false)

View File

@@ -10,27 +10,31 @@ $formats = [
];
foreach ($formats as $format) {
$d = DateInterval::createFromDateString($format);
try {
$d = DateInterval::createFromDateString($format);
} catch (DateMalformedIntervalStringException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
}
echo "====\n";
foreach ($formats as $format) {
$d = date_interval_create_from_date_string($format);
}
?>
--EXPECTF--
Warning: DateInterval::createFromDateString(): String 'next weekday 15:30' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
DateMalformedIntervalStringException: String 'next weekday 15:30' contains non-relative elements
DateMalformedIntervalStringException: String '+5 hours noon' contains non-relative elements
DateMalformedIntervalStringException: String '-8 days March 23' contains non-relative elements
DateMalformedIntervalStringException: String '+72 seconds UTC' contains non-relative elements
====
Warning: DateInterval::createFromDateString(): String '+5 hours noon' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String 'next weekday 15:30' contains non-relative elements in %s on line %d
Warning: DateInterval::createFromDateString(): String '-8 days March 23' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String '+5 hours noon' contains non-relative elements in %s on line %d
Warning: DateInterval::createFromDateString(): String '+72 seconds UTC' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String '-8 days March 23' contains non-relative elements in %s on line %d
Warning: date_interval_create_from_date_string(): String 'next weekday 15:30' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String '+5 hours noon' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String '-8 days March 23' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String '+72 seconds UTC' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
Warning: date_interval_create_from_date_string(): String '+72 seconds UTC' contains non-relative elements in %s on line %d

View File

@@ -6,24 +6,24 @@ Test bad ISO date formats passed to DatePeriod constructor
try {
new DatePeriod("R4");
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
new DatePeriod("R4/2012-07-01T00:00:00Z");
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
new DatePeriod("2012-07-01T00:00:00Z/P7D");
} catch (Exception $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
DatePeriod::__construct(): ISO interval must contain a start date, "R4" given
DatePeriod::__construct(): ISO interval must contain an interval, "R4/2012-07-01T00:00:00Z" given
DatePeriod::__construct(): ISO interval must contain an end date or a recurrence count, "2012-07-01T00:00:00Z/P7D" given
DateMalformedPeriodStringException: DatePeriod::__construct(): ISO interval must contain a start date, "R4" given
DateMalformedPeriodStringException: DatePeriod::__construct(): ISO interval must contain an interval, "R4/2012-07-01T00:00:00Z" given
DateMalformedPeriodStringException: DatePeriod::__construct(): ISO interval must contain an end date or a recurrence count, "2012-07-01T00:00:00Z/P7D" given

View File

@@ -9,10 +9,10 @@ try {
"start" => new DateTime,
]
);
} catch (\Error $exception) {
echo $exception->getMessage() . "\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object

View File

@@ -14,10 +14,10 @@ try {
"start" => new DateTime,
]
);
} catch (\Error $exception) {
echo $exception->getMessage() . "\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object

View File

@@ -20,15 +20,15 @@ try {
"include_end_date" => true,
]
);
} catch (\Error $exception) {
echo $exception->getMessage() . "\n";
} catch (\Error $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
var_dump($period);
?>
--EXPECTF--
Invalid serialization data for DatePeriod object
Error: Invalid serialization data for DatePeriod object
object(DatePeriod)#%d (%d) {
["start"]=>
object(DateTime)#%d (%d) {

View File

@@ -1,8 +1,8 @@
--TEST--
Test mktime() function : error conditions
Test mktime() function: error conditions
--FILE--
<?php
//Set the default time zone
// Set the default time zone
date_default_timezone_set("Europe/London");
echo "*** Testing mktime() : error conditions ***\n";
@@ -11,7 +11,7 @@ echo "\n-- Testing mktime() function with Zero arguments --\n";
try {
var_dump( mktime() );
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
echo "\n-- Testing mktime() function with more than expected no. of arguments --\n";
@@ -25,7 +25,7 @@ $extra_arg = 10;
try {
var_dump( mktime($hour, $minute, $sec, $month, $day, $year, $extra_arg) );
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
@@ -33,7 +33,7 @@ try {
*** Testing mktime() : error conditions ***
-- Testing mktime() function with Zero arguments --
mktime() expects at least 1 argument, 0 given
ArgumentCountError: mktime() expects at least 1 argument, 0 given
-- Testing mktime() function with more than expected no. of arguments --
mktime() expects at most 6 arguments, 7 given
ArgumentCountError: mktime() expects at most 6 arguments, 7 given

View File

@@ -23,13 +23,13 @@ try {
$d = new _d;
var_dump($d->format("Y-m-d H:i:s"));
} catch (Error $e) {
echo $e->getMessage(),"\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
new DateTime("1am todax");
} catch (Exception $e) {
echo $e->getMessage(),"\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
$t = new DateTimeZone("UTC");
@@ -39,36 +39,36 @@ try {
$t = new _t;
var_dump($t->getName());
} catch (Error $e) {
echo $e->getMessage(),"\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
new DateTimeZone("GottaFindThisOne");
} catch (Exception $e) {
echo $e->getMessage(),"\n";
} catch (DateInvalidTimeZoneException $e) {
echo $e::class, ': ', $e->getMessage(), "\n";
}
$p = new _p;
try {
var_dump($p->getStartDate());
} catch (Error $e) {
echo $e->getMessage(),"\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump($p->getDateInterval());
} catch (Error $e) {
echo $e->getMessage(),"\n";
echo $e::class, ': ', $e->getMessage(), "\n";
}
echo "DONE\n";
?>
--EXPECTF--
string(19) "%d-%d-%d %d:%d:%d"
The DateTime object has not been correctly initialized by its constructor
Failed to parse time string (1am todax) at position 4 (t): The timezone could not be found in the database
DateObjectError: Object of type _d (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
DateMalformedStringException: Failed to parse time string (1am todax) at position 4 (t): The timezone could not be found in the database
string(3) "UTC"
The DateTimeZone object has not been correctly initialized by its constructor
DateTimeZone::__construct(): Unknown or bad timezone (GottaFindThisOne)
The DatePeriod object has not been correctly initialized by its constructor
The DatePeriod object has not been correctly initialized by its constructor
DateObjectError: Object of type _t (inheriting DateTimeZone) has not been correctly initialized by calling parent::__construct() in its constructor
DateInvalidTimeZoneException: DateTimeZone::__construct(): Unknown or bad timezone (GottaFindThisOne)
DateObjectError: Object of type _p (inheriting DatePeriod) has not been correctly initialized by calling parent::__construct() in its constructor
DateObjectError: Object of type _p (inheriting DatePeriod) has not been correctly initialized by calling parent::__construct() in its constructor
DONE

View File

@@ -10,15 +10,15 @@ date.timezone=UTC
try {
var_dump(timezone_identifiers_list(DateTimeZone::PER_COUNTRY));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
echo $e::class, ': ', $e->getMessage(), "\n";
}
try {
var_dump(timezone_identifiers_list(DateTimeZone::PER_COUNTRY, 'A'));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
echo $e::class, ': ', $e->getMessage(), "\n";
}
?>
--EXPECT--
timezone_identifiers_list(): Argument #2 ($countryCode) must be a two-letter ISO 3166-1 compatible country code when argument #1 ($timezoneGroup) is DateTimeZone::PER_COUNTRY
timezone_identifiers_list(): Argument #2 ($countryCode) must be a two-letter ISO 3166-1 compatible country code when argument #1 ($timezoneGroup) is DateTimeZone::PER_COUNTRY
ValueError: timezone_identifiers_list(): Argument #2 ($countryCode) must be a two-letter ISO 3166-1 compatible country code when argument #1 ($timezoneGroup) is DateTimeZone::PER_COUNTRY
ValueError: timezone_identifiers_list(): Argument #2 ($countryCode) must be a two-letter ISO 3166-1 compatible country code when argument #1 ($timezoneGroup) is DateTimeZone::PER_COUNTRY

View File

@@ -0,0 +1,23 @@
--TEST--
timezone_open() invalid timezones
--FILE--
<?php
$timezones = [ "+02:30", "Europe/Kyiv", 2.5, /*"Europe/K\0v",*/ "99:60", "Europe/Lviv" ];
foreach( $timezones as $timezone )
{
$d = timezone_open( $timezone );
if ($d) {
echo "In: {$timezone}; Out: ", $d->getName(), "\n";
}
}
?>
--EXPECTF--
In: +02:30; Out: +02:30
In: Europe/Kyiv; Out: Europe/Kyiv
Warning: timezone_open(): Unknown or bad timezone (2.5) in %stimezone_open_warning.php on line 6
Warning: timezone_open(): Unknown or bad timezone (99:60) in %stimezone_open_warning.php on line 6
Warning: timezone_open(): Unknown or bad timezone (Europe/Lviv) in %stimezone_open_warning.php on line 6

View File

@@ -36,7 +36,7 @@ Warning: IntlDateFormatter::formatObject(): datefmt_format_object: bad IntlCalen
bool(false)
Warning: IntlDateFormatter::formatObject(): datefmt_format_object: error calling ::getTimeStamp() on the object in %s on line %d
The DateTime object has not been correctly initialized by its constructor
Object of type B (inheriting DateTime) has not been correctly initialized by calling parent::__construct() in its constructor
Warning: IntlDateFormatter::formatObject(): datefmt_format_object: the date/time format type is invalid in %s on line %d
bool(false)