Working with Dates and TimesZend_Locale_Format provides several methods for working with dates
and times to help convert and normalize between different formats for different locales. Use
Zend_Date for manipulating dates, and working with date strings that
already conform to one of the many internationally
recognized standard formats, or one of the localized date formats supported by
Zend_Date. Using an existing, pre-defined format offers
advantages, including the use of well-tested code, and the assurance of some degree of
portability and interoperability (depending on the standard used). The examples below do not
follow these recommendations, since using non-standard date formats would needlessly
increase the difficulty of understanding these examples.
Normalizing Dates and Times
The getDate() method parses strings containing dates in
localized formats. The results are returned in a structured array, with well-defined
keys for each part of the date. In addition, the array will contain a key 'date_format'
showing the format string used to parse the input date string. Since a localized date
string may not contain all parts of a date/time, the key-value pairs are optional. for
example, if only the year, month, and day is given, then all time values are suppressed
from the returned array, and vice-versa if only hour, minute, and second were given as
input. If no date or time can be found within the given input, an exception will be
thrown.
If setOption(array('fix_date' => true)) is set the
getDate() method adds a key 'fixed' with a whole number value
indicating if the input date string required "fixing" by rearranging the day, month, or
year in the input to fit the format used.
Key values for getDate() with option 'fix_date'valuemeaning0nothing to fix1fixed false month2swapped day and year3swapped month and year4swapped month and day
For those needing to specify explicitly the format of the date string, the following
format token specifiers are supported. If an invalid format specifier is used, such as
the PHP 'i' specifier when in ISO format mode,
then an error will be thrown by the methods in Zend_Locale_Format
that support user-defined formats.
These specifiers (below) are a small subset of the full "ISO" set supported by
Zend_Date's toString(). If you need to
use PHP date() compatible format specifiers,
then first call setOptions(array('format_type' => 'php')). And
if you want to convert only one special format string from PHP
date() compatible format to "ISO" format use
convertPhpToIsoFormat(). Currently, the only practical
difference relates to the specifier for minutes ('m' using the ISO
default, and 'i' using the PHP date format).
Return valuesgetDate() format characterArray keyReturned valueMinimumMaximumddayinteger131Mmonthinteger112yyearintegerno limitPHP integer's maximumhhourinteger0PHP integer's maximummminuteinteger0PHP integer's maximumssecondinteger0PHP integer's maximum
Normalizing a date 'dd.MM.yyyy',
)
);
print_r($dateString); // outputs:
Array
(
[date_format] => dd.MM.yyyy
[locale] => de_DE
[day] => 13
[month] => 04
[year] => 2006
)
// creates a Zend_Date object for this date
$dateObject = new Zend_Date('13.04.2006', 'dd.MM.yyyy');
print_r($dateObject); // outputs:
Zend_Date Object
(
[_locale:Zend_Date:private] => de_DE
[_fractional:Zend_Date:private] => 0
[_precision:Zend_Date:private] => 3
[_unixTimestamp:Zend_Date_DateObject:private] => 1144879200
[_timezone:Zend_Date_DateObject:private] => Europe/Berlin
[_offset:Zend_Date_DateObject:private] => -3600
[_syncronised:Zend_Date_DateObject:private] => 0
[_dst:protected] => 1
)
// alternatively, some types of problems with input data can be
// automatically corrected
$date = Zend_Locale_Format::getDate(
'04.13.2006',
array(
'date_format' => 'dd.MM.yyyy',
'fix_date' => true,
)
);
print_r($date); // outputs:
Array
(
[date_format] => dd.MM.yyyy
[locale] => de_DE
[day] => 13
[month] => 04
[year] => 2006
[fixed] => 4
)
]]>
Since getDate() is "locale-aware", specifying the
$locale is sufficient for date strings adhering to that locale's
format. The option 'fix_date' uses simple tests to determine if the
day or month is not valid, and then applies heuristics to try and correct any detected
problems. Note the use of 'Zend_Locale_Format::STANDARD' as the
value for 'date_format' to prevent the use of a class-wide default
date format set using setOptions(). This forces getDate to use
the default date format for $locale.
Normalizing a date by locale
Zend_Locale_Format::STANDARD,
'locale' => $locale)
);
print_r ($date);
]]>
A complete date and time is returned when the input contains both a date and time in the
expected format.
Normalizing a date with time
Zend_Locale_Format::STANDARD,
'locale' => $locale)
);
print_r ($date);
]]>
If a specific format is desired, specify the $format argument,
without giving a $locale. Only single-letter codes
(H, m, s, y, M, d), and MMMM and EEEE are supported in the $format.
Normalizing a userdefined date
'ddyyyyMM ssmmHH')
);
print_r ($date);
]]>
The format can include the following signs :
Format definitionFormat LetterDescriptiond or dd1 or 2 digit dayM or MM1 or 2 digit monthy or yy1 or 2 digit yearyyyy4 digit yearh1 or 2 digit hourm1 or 2 digit minutes1 or 2 digit second
Database date format
To parse a database date value (f.e. MySql or MsSql), use
Zend_Date's ISO_8601 format instead of getDate().
The option 'fix_date' uses simple tests to determine if the day or
month is not valid, and then applies heuristics to try and correct any detected
problems. getDate() automatically detects and corrects some
kinds of problems with input, such as misplacing the year:
Automatic correction of input dates 'ddMMyy',
'fix_date' => true)
);
// instead of 41 for the day, the 41 will be returned as year value
print_r ($date);
]]>Testing Dates
Use checkDateFormat($inputString, array('date_format' => $format,
$locale)) to check if a given string contains all expected date parts.
The checkDateFormat() method uses
getDate(), but without the option
'fixdate' to avoid returning TRUE when the
input fails to conform to the date format. If errors are detected in the input, such as
swapped values for months and days, the option 'fixdate' method
will apply heuristics to "correct" dates before determining their validity.
Date testing
Zend_Locale_Format::STANDARD,
$locale)
) {
print "date";
} else {
print "not a date";
}
]]>Normalizing a Time
Normally, a time will be returned with a date, if the input contains both. If the proper
format is not known, but the locale relevant to the user input is known, then
getTime() should be used, because it uses the default time
format for the selected locale.
Normalize an unknown time
Zend_Locale_Format::STANDARD,
'locale' => $locale)) {
print "time";
} else {
print "not a time";
}
]]>Testing Times
Use checkDateFormat() to check if a given string contains a
proper time. The usage is exact the same as with checking Dates, only
date_format should contain the parts which you expect to have.
Testing a time 'HH:mm:ss',
'locale' => $locale)) {
print "time";
} else {
print "not a time";
}
]]>