From f236eb83b41c42f9d01d4be07abc69890c51df86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Sun, 9 Jul 2023 14:02:48 +0200 Subject: [PATCH] Add IntlCalendar::setDate() and IntlCalendar::setDateTime() --- ext/intl/calendar/calendar.stub.php | 4 ++ ext/intl/calendar/calendar_methods.cpp | 52 +++++++++++++++++++ ext/intl/tests/calendar_isSet_empty_time.phpt | 30 +++++++++++ ext/intl/tests/calendar_set_date.phpt | 17 ++++++ ext/intl/tests/calendar_set_date_time.phpt | 20 +++++++ 5 files changed, 123 insertions(+) create mode 100644 ext/intl/tests/calendar_isSet_empty_time.phpt create mode 100644 ext/intl/tests/calendar_set_date.phpt create mode 100644 ext/intl/tests/calendar_set_date_time.phpt diff --git a/ext/intl/calendar/calendar.stub.php b/ext/intl/calendar/calendar.stub.php index 748d5eaf252..026039776c2 100644 --- a/ext/intl/calendar/calendar.stub.php +++ b/ext/intl/calendar/calendar.stub.php @@ -437,6 +437,10 @@ class IntlCalendar */ public function set(int $year, int $month, int $dayOfMonth = UNKNOWN, int $hour = UNKNOWN, int $minute = UNKNOWN, int $second = UNKNOWN) {} // TODO make return type void + public function setDate(int $year, int $month, int $dayOfMonth): void {} + + public function setDateTime(int $year, int $month, int $dayOfMonth, int $hour, int $minute, ?int $second = null): void {} + /** * @return true * @alias intlcal_set_first_day_of_week diff --git a/ext/intl/calendar/calendar_methods.cpp b/ext/intl/calendar/calendar_methods.cpp index 19b12e6e226..506f3487f51 100644 --- a/ext/intl/calendar/calendar_methods.cpp +++ b/ext/intl/calendar/calendar_methods.cpp @@ -408,6 +408,58 @@ U_CFUNC PHP_FUNCTION(intlcal_set) RETURN_TRUE; } +U_CFUNC PHP_METHOD(IntlCalendar, setDate) +{ + zend_long year, month, day; + + CALENDAR_METHOD_INIT_VARS; + + object = getThis(); + + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), object, "Olll", + &object, Calendar_ce_ptr, &year, &month, &day) == FAILURE) { + RETURN_THROWS(); + } + + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 1); + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 2); + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 3); + + CALENDAR_METHOD_FETCH_OBJECT; + + co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day); +} + +U_CFUNC PHP_METHOD(IntlCalendar, setDateTime) +{ + zend_long year, month, day, hour, minute, second = 0; + bool second_is_null = true; + + CALENDAR_METHOD_INIT_VARS; + + object = getThis(); + + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), object, "Olllll|l!", + &object, Calendar_ce_ptr, &year, &month, &day, &hour, &minute, &second, &second_is_null) == FAILURE) { + RETURN_THROWS(); + } + + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 1); + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 2); + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 3); + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(hour, 4); + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(minute, 5); + + CALENDAR_METHOD_FETCH_OBJECT; + + if (second_is_null) { + co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute); + } else { + ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(second, 6); + co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, (int32_t) second); + } +} + U_CFUNC PHP_FUNCTION(intlcal_roll) { zval *zvalue; diff --git a/ext/intl/tests/calendar_isSet_empty_time.phpt b/ext/intl/tests/calendar_isSet_empty_time.phpt new file mode 100644 index 00000000000..0fbecd72b63 --- /dev/null +++ b/ext/intl/tests/calendar_isSet_empty_time.phpt @@ -0,0 +1,30 @@ +--TEST-- +Test IntlCalendar::setDateTime() +--EXTENSIONS-- +intl +--FILE-- +clear(); + +$intlcal->set(2012, 1, 29, 23, 58); +var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND)); +var_dump($intlcal->get(IntlCalendar::FIELD_MINUTE)); +var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND)); + +$intlcal->clear(); + +$intlcal->setDateTime(2012, 1, 29, 23, 58); +var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND)); +var_dump($intlcal->get(IntlCalendar::FIELD_MINUTE)); +var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND)); + +?> +--EXPECT-- +bool(false) +int(58) +bool(true) +bool(false) +int(58) +bool(true) diff --git a/ext/intl/tests/calendar_set_date.phpt b/ext/intl/tests/calendar_set_date.phpt new file mode 100644 index 00000000000..042c8b91ecb --- /dev/null +++ b/ext/intl/tests/calendar_set_date.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test IntlCalendar::setDate() +--EXTENSIONS-- +intl +--FILE-- +clear(); + +$intlcal->setDate(2012, 1, 29); +var_dump($intlcal->getTime(), strtotime('2012-02-29 00:00:00 +0000') * 1000.); + +?> +--EXPECT-- +float(1330473600000) +float(1330473600000) diff --git a/ext/intl/tests/calendar_set_date_time.phpt b/ext/intl/tests/calendar_set_date_time.phpt new file mode 100644 index 00000000000..950483358d1 --- /dev/null +++ b/ext/intl/tests/calendar_set_date_time.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test IntlCalendar::setDateTime() +--EXTENSIONS-- +intl +--FILE-- +setDateTime(2012, 1, 29, 23, 58); +var_dump($intlcal->getTime(), strtotime('2012-02-29 23:58:00 +0000') * 1000.); + +$intlcal->setDateTime(2012, 1, 29, 23, 58, 31); +var_dump($intlcal->getTime(), strtotime('2012-02-29 23:58:31 +0000') * 1000.); + +?> +--EXPECT-- +float(1330559880000) +float(1330559880000) +float(1330559911000) +float(1330559911000)