Skip to content

Commit f236eb8

Browse files
committed
Add IntlCalendar::setDate() and IntlCalendar::setDateTime()
1 parent 1126232 commit f236eb8

File tree

5 files changed

+123
-0
lines changed

5 files changed

+123
-0
lines changed

ext/intl/calendar/calendar.stub.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,10 @@ public function isSet(int $field): bool {}
437437
*/
438438
public function set(int $year, int $month, int $dayOfMonth = UNKNOWN, int $hour = UNKNOWN, int $minute = UNKNOWN, int $second = UNKNOWN) {} // TODO make return type void
439439

440+
public function setDate(int $year, int $month, int $dayOfMonth): void {}
441+
442+
public function setDateTime(int $year, int $month, int $dayOfMonth, int $hour, int $minute, ?int $second = null): void {}
443+
440444
/**
441445
* @return true
442446
* @alias intlcal_set_first_day_of_week

ext/intl/calendar/calendar_methods.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,58 @@ U_CFUNC PHP_FUNCTION(intlcal_set)
408408
RETURN_TRUE;
409409
}
410410

411+
U_CFUNC PHP_METHOD(IntlCalendar, setDate)
412+
{
413+
zend_long year, month, day;
414+
415+
CALENDAR_METHOD_INIT_VARS;
416+
417+
object = getThis();
418+
419+
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), object, "Olll",
420+
&object, Calendar_ce_ptr, &year, &month, &day) == FAILURE) {
421+
RETURN_THROWS();
422+
}
423+
424+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 1);
425+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 2);
426+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 3);
427+
428+
CALENDAR_METHOD_FETCH_OBJECT;
429+
430+
co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day);
431+
}
432+
433+
U_CFUNC PHP_METHOD(IntlCalendar, setDateTime)
434+
{
435+
zend_long year, month, day, hour, minute, second = 0;
436+
bool second_is_null = true;
437+
438+
CALENDAR_METHOD_INIT_VARS;
439+
440+
object = getThis();
441+
442+
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), object, "Olllll|l!",
443+
&object, Calendar_ce_ptr, &year, &month, &day, &hour, &minute, &second, &second_is_null) == FAILURE) {
444+
RETURN_THROWS();
445+
}
446+
447+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 1);
448+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 2);
449+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 3);
450+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(hour, 4);
451+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(minute, 5);
452+
453+
CALENDAR_METHOD_FETCH_OBJECT;
454+
455+
if (second_is_null) {
456+
co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute);
457+
} else {
458+
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(second, 6);
459+
co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, (int32_t) second);
460+
}
461+
}
462+
411463
U_CFUNC PHP_FUNCTION(intlcal_roll)
412464
{
413465
zval *zvalue;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
Test IntlCalendar::setDateTime()
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
8+
$intlcal = IntlCalendar::createInstance('UTC');
9+
$intlcal->clear();
10+
11+
$intlcal->set(2012, 1, 29, 23, 58);
12+
var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND));
13+
var_dump($intlcal->get(IntlCalendar::FIELD_MINUTE));
14+
var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND));
15+
16+
$intlcal->clear();
17+
18+
$intlcal->setDateTime(2012, 1, 29, 23, 58);
19+
var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND));
20+
var_dump($intlcal->get(IntlCalendar::FIELD_MINUTE));
21+
var_dump($intlcal->isSet(IntlCalendar::FIELD_SECOND));
22+
23+
?>
24+
--EXPECT--
25+
bool(false)
26+
int(58)
27+
bool(true)
28+
bool(false)
29+
int(58)
30+
bool(true)

ext/intl/tests/calendar_set_date.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Test IntlCalendar::setDate()
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
8+
$intlcal = IntlCalendar::createInstance('UTC');
9+
$intlcal->clear();
10+
11+
$intlcal->setDate(2012, 1, 29);
12+
var_dump($intlcal->getTime(), strtotime('2012-02-29 00:00:00 +0000') * 1000.);
13+
14+
?>
15+
--EXPECT--
16+
float(1330473600000)
17+
float(1330473600000)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
Test IntlCalendar::setDateTime()
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
8+
//two minutes to midnight!
9+
$intlcal->setDateTime(2012, 1, 29, 23, 58);
10+
var_dump($intlcal->getTime(), strtotime('2012-02-29 23:58:00 +0000') * 1000.);
11+
12+
$intlcal->setDateTime(2012, 1, 29, 23, 58, 31);
13+
var_dump($intlcal->getTime(), strtotime('2012-02-29 23:58:31 +0000') * 1000.);
14+
15+
?>
16+
--EXPECT--
17+
float(1330559880000)
18+
float(1330559880000)
19+
float(1330559911000)
20+
float(1330559911000)

0 commit comments

Comments
 (0)