diff options
| author | Derick Rethans <derick@php.net> | 2008-01-27 17:29:14 +0000 | 
|---|---|---|
| committer | Derick Rethans <derick@php.net> | 2008-01-27 17:29:14 +0000 | 
| commit | 216d0cb0ffc4345aadeaa21bd84d25efaaff5279 (patch) | |
| tree | ab1512a038ddb51f2d09848b62afb754a1884777 | |
| parent | 89d271a7b03339bd56e3a4a03ab8225a04116f88 (diff) | |
| download | php-git-216d0cb0ffc4345aadeaa21bd84d25efaaff5279.tar.gz | |
- MFH: Added support for selectively listing timezone identifiers through
  timezone_identifiers_list() / DateTimezone::listIdentifiers().
| -rw-r--r-- | NEWS | 8 | ||||
| -rw-r--r-- | ext/date/php_date.c | 53 | ||||
| -rw-r--r-- | ext/date/tests/timezones-list.phpt | 49 | 
3 files changed, 106 insertions, 4 deletions
| @@ -2,7 +2,7 @@ PHP                                                                        NEWS  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  ?? ??? 20??, PHP 5.3.0  - Added garbage collector. (David Wang, Dmitry). -- Added new date/time functionality: +- Added new date/time functionality: (Derick)    * date_parse_from_format(): Parse date/time strings according to a format.    * date_create_from_format()/DateTime::createFromFormat(): Create a date/time @@ -14,6 +14,10 @@ PHP                                                                        NEWS  	- date_parse_from_format()    * support for abbreviation and offset based timezone specifiers for      DateTime::getOffset() and DateTime::getName(). +  * support for selectively listing timezone identifiers through +    timezone_identifiers_list() / DateTimezone::listIdentifiers(). +  * date_timestamp_set() / DateTime::setTimestamp() to set a Unix timestamp +    without invoking the date parser. (Scott)  - Added ability to use Traversable objects instead of plain arrays in ext/soap.    (Joshua Reese, Dmitry) @@ -40,8 +44,6 @@ PHP                                                                        NEWS    (Etienne Kneuss)  - Added "compact" handler for Zend MM storage. (Dmitry)  - Added "+" and "*" specifiers to zend_parse_parameters(). (Andrei) -- Added DateTime::setTimestamp() to set a unix timestamp without -  invoking the date parser. (Scott)  - Added SplDoublyLinkedList, SplStack, SplQueue classes. (Etienne)  - Removed the experimental RPL (master/slave) functions from mysqli. (Andrey) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 598ee79487..f5f3551f03 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1497,6 +1497,19 @@ PHP_FUNCTION(getdate)  }  /* }}} */ +#define PHP_DATE_TIMEZONE_GROUP_AMERICA    0x0001 +#define PHP_DATE_TIMEZONE_GROUP_ANTARCTICA 0x0002 +#define PHP_DATE_TIMEZONE_GROUP_ARCTIC     0x0004 +#define PHP_DATE_TIMEZONE_GROUP_ASIA       0x0008 +#define PHP_DATE_TIMEZONE_GROUP_ATLANTIC   0x0010 +#define PHP_DATE_TIMEZONE_GROUP_AUSTRALIA  0x0020 +#define PHP_DATE_TIMEZONE_GROUP_EUROPE     0x0040 +#define PHP_DATE_TIMEZONE_GROUP_INDIAN     0x0080 +#define PHP_DATE_TIMEZONE_GROUP_PACIFIC    0x0100 +#define PHP_DATE_TIMEZONE_GROUP_UTC        0x0200 +#define PHP_DATE_TIMEZONE_GROUP_ALL        0x03FF +#define PHP_DATE_TIMEZONE_GROUP_ALL_W_BC   0x07FF +  static void date_register_classes(TSRMLS_D)  {  	zend_class_entry ce_date, ce_timezone; @@ -1529,6 +1542,22 @@ static void date_register_classes(TSRMLS_D)  	date_ce_timezone = zend_register_internal_class_ex(&ce_timezone, NULL, NULL TSRMLS_CC);  	memcpy(&date_object_handlers_timezone, zend_get_std_object_handlers(), sizeof(zend_object_handlers));  	date_object_handlers_timezone.clone_obj = date_object_clone_timezone; + +#define REGISTER_TIMEZONE_CLASS_CONST_STRING(const_name, value) \ +	zend_declare_class_constant_long(date_ce_timezone, const_name, sizeof(const_name)-1, value TSRMLS_CC); + +	REGISTER_TIMEZONE_CLASS_CONST_STRING("AMERICA",     PHP_DATE_TIMEZONE_GROUP_AMERICA); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("ANTARCTICA",  PHP_DATE_TIMEZONE_GROUP_ANTARCTICA); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("ARCTIC",      PHP_DATE_TIMEZONE_GROUP_ARCTIC); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("ASIA",        PHP_DATE_TIMEZONE_GROUP_ASIA); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("ATLANTIC",    PHP_DATE_TIMEZONE_GROUP_ATLANTIC); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("AUSTRALIA",   PHP_DATE_TIMEZONE_GROUP_AUSTRALIA); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("EUROPE",      PHP_DATE_TIMEZONE_GROUP_EUROPE); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("INDIAN",      PHP_DATE_TIMEZONE_GROUP_INDIAN); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("PACIFIC",     PHP_DATE_TIMEZONE_GROUP_PACIFIC); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("UTC",         PHP_DATE_TIMEZONE_GROUP_UTC); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("ALL",         PHP_DATE_TIMEZONE_GROUP_ALL); +	REGISTER_TIMEZONE_CLASS_CONST_STRING("ALL_WITH_BC", PHP_DATE_TIMEZONE_GROUP_ALL_W_BC);  }  static inline zend_object_value date_object_new_date_ex(zend_class_entry *class_type, php_date_obj **ptr TSRMLS_DC) @@ -2423,6 +2452,21 @@ PHP_FUNCTION(timezone_transitions_get)  }  /* }}} */ +static int check_id_allowed(char *id, long what) +{ +	if (what & PHP_DATE_TIMEZONE_GROUP_AMERICA    && strncasecmp(id, "America/",     8) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_ANTARCTICA && strncasecmp(id, "Antarctica/", 11) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_ARCTIC     && strncasecmp(id, "Arctic/",      7) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_ASIA       && strncasecmp(id, "Asia/",        5) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_ATLANTIC   && strncasecmp(id, "Atlantic/",    9) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_AUSTRALIA  && strncasecmp(id, "Australia/",  10) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_EUROPE     && strncasecmp(id, "Europe/",      7) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_INDIAN     && strncasecmp(id, "Indian/",      7) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_PACIFIC    && strncasecmp(id, "Pacific/",     8) == 0) return 1; +	if (what & PHP_DATE_TIMEZONE_GROUP_UTC        && strncasecmp(id, "UTC",          3) == 0) return 1; +	return 0; +} +  /* {{{ proto array timezone_identifiers_list()     Returns numerically index array with all timezone identifiers.  */ @@ -2431,6 +2475,11 @@ PHP_FUNCTION(timezone_identifiers_list)  	const timelib_tzdb             *tzdb;  	const timelib_tzdb_index_entry *table;  	int                             i, item_count; +	long                            what = PHP_DATE_TIMEZONE_GROUP_ALL; + +	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &what) == FAILURE) { +		RETURN_FALSE; +	}  	tzdb = DATE_TIMEZONEDB;  	item_count = tzdb->index_size; @@ -2439,7 +2488,9 @@ PHP_FUNCTION(timezone_identifiers_list)  	array_init(return_value);  	for (i = 0; i < item_count; ++i) { -		add_next_index_string(return_value, table[i].id, 1); +		if (what == PHP_DATE_TIMEZONE_GROUP_ALL_W_BC || check_id_allowed(table[i].id, what)) { +			add_next_index_string(return_value, table[i].id, 1); +		}  	};  }  /* }}} */ diff --git a/ext/date/tests/timezones-list.phpt b/ext/date/tests/timezones-list.phpt new file mode 100644 index 0000000000..5998498742 --- /dev/null +++ b/ext/date/tests/timezones-list.phpt @@ -0,0 +1,49 @@ +--TEST-- +timezone_identifiers_list() +--FILE-- +<?php +$a = timezone_identifiers_list(); +$b = timezone_identifiers_list( DateTimezone::AMERICA ); +$c = timezone_identifiers_list( DateTimezone::ALL_WITH_BC ); +$d = timezone_identifiers_list( DateTimezone::EUROPE | DateTimezone::UTC ); + +echo in_array( "Europe/Oslo", $a ) ? "found" : "notfound", "\n"; +echo in_array( "Europe/Oslo", $b ) ? "found" : "notfound", "\n"; +echo in_array( "Europe/Oslo", $c ) ? "found" : "notfound", "\n"; +echo in_array( "Europe/Oslo", $d ) ? "found" : "notfound", "\n\n"; + +echo in_array( "America/New_York", $a ) ? "found" : "notfound", "\n"; +echo in_array( "America/New_York", $b ) ? "found" : "notfound", "\n"; +echo in_array( "America/New_York", $c ) ? "found" : "notfound", "\n"; +echo in_array( "America/New_York", $d ) ? "found" : "notfound", "\n\n"; + +echo in_array( "UTC", $a ) ? "found" : "notfound", "\n"; +echo in_array( "UTC", $b ) ? "found" : "notfound", "\n"; +echo in_array( "UTC", $c ) ? "found" : "notfound", "\n"; +echo in_array( "UTC", $d ) ? "found" : "notfound", "\n\n"; + +echo in_array( "US/Eastern", $a ) ? "found" : "notfound", "\n"; +echo in_array( "US/Eastern", $b ) ? "found" : "notfound", "\n"; +echo in_array( "US/Eastern", $c ) ? "found" : "notfound", "\n"; +echo in_array( "US/Eastern", $d ) ? "found" : "notfound", "\n\n"; +?> +--EXPECT-- +found +notfound +found +found + +found +found +found +notfound + +found +notfound +found +found + +notfound +notfound +found +notfound | 
