summaryrefslogtreecommitdiff
path: root/framework/I18N/core/DateFormat.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/I18N/core/DateFormat.php')
-rw-r--r--framework/I18N/core/DateFormat.php1304
1 files changed, 652 insertions, 652 deletions
diff --git a/framework/I18N/core/DateFormat.php b/framework/I18N/core/DateFormat.php
index 7724a480..27c9d3c6 100644
--- a/framework/I18N/core/DateFormat.php
+++ b/framework/I18N/core/DateFormat.php
@@ -1,652 +1,652 @@
-<?php
-/**
- * DateFormat class file.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the BSD License.
- *
- * Copyright(c) 2004 by Qiang Xue. All rights reserved.
- *
- * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
- * The latest version of PRADO can be obtained from:
- * {@link http://prado.sourceforge.net/}
- *
- * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version $Revision: 1.8 $ $Date: 2005/12/15 07:14:49 $
- * @package System.I18N.core
- */
-
-/**
- * Get the DateTimeFormatInfo class.
- */
-require_once(dirname(__FILE__).'/DateTimeFormatInfo.php');
-
-/**
- * Get the encoding utilities
- */
-require_once(dirname(__FILE__).'/util.php');
-
-/**
- * DateFormat class.
- *
- * The DateFormat class allows you to format dates and times with
- * predefined styles in a locale-sensitive manner. Formatting times
- * with the DateFormat class is similar to formatting dates.
- *
- * Formatting dates with the DateFormat class is a two-step process.
- * First, you create a formatter with the getDateInstance method.
- * Second, you invoke the format method, which returns a string containing
- * the formatted date.
- *
- * DateTime values are formatted using standard or custom patterns stored
- * in the properties of a DateTimeFormatInfo.
- *
- * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version v1.0, last update on Sat Dec 04 14:10:49 EST 2004
- * @package System.I18N.core
- */
-class DateFormat
-{
- /**
- * A list of tokens and their function call.
- * @var array
- */
- protected $tokens = array(
- 'G'=>'Era',
- 'y'=>'Year',
- 'M'=>'Month',
- 'd'=>'Day',
- 'h'=>'Hour12',
- 'H'=>'Hour24',
- 'm'=>'Minutes',
- 's'=>'Seconds',
- 'E'=>'DayInWeek',
- 'D'=>'DayInYear',
- 'F'=>'DayInMonth',
- 'w'=>'WeekInYear',
- 'W'=>'WeekInMonth',
- 'a'=>'AMPM',
- 'k'=>'HourInDay',
- 'K'=>'HourInAMPM',
- 'z'=>'TimeZone'
- );
-
- /**
- * A list of methods, to be used by the token function calls.
- * @var array
- */
- protected $methods = array();
-
- /**
- * The DateTimeFormatInfo, containing culture specific patterns and names.
- * @var DateTimeFormatInfo
- */
- protected $formatInfo;
-
- /**
- * Initialize a new DateFormat.
- * @param mixed either, null, a CultureInfo instance,
- * a DateTimeFormatInfo instance, or a locale.
- * @return DateFormat instance
- */
- function __construct($formatInfo=null)
- {
- if($formatInfo === null)
- $this->formatInfo = DateTimeFormatInfo::getInvariantInfo();
- else if($formatInfo instanceof CultureInfo)
- $this->formatInfo = $formatInfo->DateTimeFormat;
- else if($formatInfo instanceof DateTimeFormatInfo)
- $this->formatInfo = $formatInfo;
- else
- $this->formatInfo = DateTimeFormatInfo::getInstance($formatInfo);
-
- $this->methods = get_class_methods($this);
- }
-
- /**
- * Format a date according to the pattern.
- * @param mixed the time as integer or string in strtotime format.
- * @return string formatted date time.
- */
- public function format($time, $pattern='F', $charset='UTF-8')
- {
- if (is_numeric($time)) //assumes unix epoch
- $time = floatval($time);
- else if(is_string($time))
- $time = @strtotime($time);
-
- if($pattern === null)
- $pattern = 'F';
-
- $s = Prado::createComponent('System.Util.TDateTimeStamp');
-
- $date = $s->getDate($time);
-
- $pattern = $this->getPattern($pattern);
-
- $tokens = $this->getTokens($pattern);
-
- for($i = 0, $k = count($tokens); $i<$k; ++$i)
- {
- $pattern = $tokens[$i];
- if($pattern{0} == "'"
- && $pattern{strlen($pattern)-1} == "'")
- {
- $sub = preg_replace('/(^\')|(\'$)/','',$pattern);
- $tokens[$i] = str_replace('``````','\'',$sub);
- }
- else if($pattern == '``````')
- {
- $tokens[$i] = '\'';
- }
- else
- {
- $function = $this->getFunctionName($pattern);
- if($function != null)
- {
- $fName = 'get'.$function;
- if(in_array($fName, $this->methods))
- {
- $rs = $this->$fName($date, $pattern);
- $tokens[$i] = $rs;
- }
- else
- throw new
- Exception('function '.$function.' not found.');
- }
- }
- }
-
- return I18N_toEncoding(implode('',$tokens), $charset);
- }
-
- /**
- * For a particular token, get the corresponding function to call.
- * @param string token
- * @return mixed the function if good token, null otherwise.
- */
- protected function getFunctionName($token)
- {
- if(isset($this->tokens[$token{0}]))
- return $this->tokens[$token{0}];
- }
-
- /**
- * Get the pattern from DateTimeFormatInfo or some predefined patterns.
- * If the $pattern parameter is an array of 2 element, it will assume
- * that the first element is the date, and second the time
- * and try to find an appropriate pattern and apply
- * DateTimeFormatInfo::formatDateTime
- * See the tutorial documentation for futher details on the patterns.
- * @param mixed a pattern.
- * @return string a pattern.
- * @see DateTimeFormatInfo::formatDateTime()
- */
- protected function getPattern($pattern)
- {
- if(is_array($pattern) && count($pattern) == 2)
- {
- return $this->formatInfo->formatDateTime(
- $this->getPattern($pattern[0]),
- $this->getPattern($pattern[1]));
- }
-
- switch($pattern)
- {
- case 'd':
- return $this->formatInfo->ShortDatePattern;
- break;
- case 'D':
- return $this->formatInfo->LongDatePattern;
- break;
- case 'p':
- return $this->formatInfo->MediumDatePattern;
- break;
- case 'P':
- return $this->formatInfo->FullDatePattern;
- break;
- case 't':
- return $this->formatInfo->ShortTimePattern;
- break;
- case 'T':
- return $this->formatInfo->LongTimePattern;
- break;
- case 'q':
- return $this->formatInfo->MediumTimePattern;
- break;
- case 'Q':
- return $this->formatInfo->FullTimePattern;
- break;
- case 'f':
- return $this->formatInfo->formatDateTime(
- $this->formatInfo->LongDatePattern,
- $this->formatInfo->ShortTimePattern);
- break;
- case 'F':
- return $this->formatInfo->formatDateTime(
- $this->formatInfo->LongDatePattern,
- $this->formatInfo->LongTimePattern);
- break;
- case 'g':
- return $this->formatInfo->formatDateTime(
- $this->formatInfo->ShortDatePattern,
- $this->formatInfo->ShortTimePattern);
- break;
- case 'G':
- return $this->formatInfo->formatDateTime(
- $this->formatInfo->ShortDatePattern,
- $this->formatInfo->LongTimePattern);
- break;
- case 'M':
- case 'm':
- return 'MMMM dd';
- break;
- case 'R':
- case 'r':
- return 'EEE, dd MMM yyyy HH:mm:ss';
- break;
- case 's':
- return 'yyyy-MM-ddTHH:mm:ss';
- break;
- case 'u':
- return 'yyyy-MM-dd HH:mm:ss z';
- break;
- case 'U':
- return 'EEEE dd MMMM yyyy HH:mm:ss';
- break;
- case 'Y':
- case 'y':
- return 'yyyy MMMM';
- break;
- default :
- return $pattern;
- }
- }
-
- /**
- * Tokenize the pattern. The tokens are delimited by group of
- * similar characters, e.g. 'aabb' will form 2 tokens of 'aa' and 'bb'.
- * Any substrings, starting and ending with a single quote (')
- * will be treated as a single token.
- * @param string pattern.
- * @return array string tokens in an array.
- */
- protected function getTokens($pattern)
- {
- $char = null;
- $tokens = array();
- $token = null;
-
- $text = false;
- $pattern = preg_replace("/''/", '``````', $pattern);
-
- for($i = 0; $i < strlen($pattern); $i++)
- {
- if($char==null || $pattern{$i} == $char || $text)
- {
- $token .= $pattern{$i};
- }
- else
- {
- $tokens[] = str_replace("","'",$token);
- $token = $pattern{$i};
- }
-
- if($pattern{$i} == "'" && $text == false)
- $text = true;
- else if($text && $pattern{$i} == "'" && $char == "'")
- $text = true;
- else if($text && $char != "'" && $pattern{$i} == "'")
- $text = false;
-
- $char = $pattern{$i};
-
- }
- $tokens[] = $token;
- return $tokens;
- }
-
- /**
- * Get the year.
- * "yy" will return the last two digits of year.
- * "yyyy" will return the full integer year.
- * @param array getdate format.
- * @param string a pattern.
- * @return string year
- */
- protected function getYear($date, $pattern='yyyy')
- {
- $year = $date['year'];
- switch($pattern)
- {
- case 'yy':
- return substr($year,2);
- case 'yyyy':
- return $year;
- default:
- throw new Exception('The pattern for year is either "yy" or "yyyy".');
- }
- }
-
- /**
- * Get the month.
- * "M" will return integer 1 through 12
- * "MM" will return the narrow month name, e.g. "J"
- * "MMM" will return the abrreviated month name, e.g. "Jan"
- * "MMMM" will return the month name, e.g. "January"
- * @param array getdate format.
- * @param string a pattern.
- * @return string month name
- */
- protected function getMonth($date, $pattern='M')
- {
- $month = $date['mon'];
-
- switch($pattern)
- {
- case 'M':
- return $month;
- case 'MM':
- return str_pad($month, 2,'0',STR_PAD_LEFT);
- case 'MMM':
- return $this->formatInfo->AbbreviatedMonthNames[$month-1];
- break;
- case 'MMMM':
- return $this->formatInfo->MonthNames[$month-1];
- default:
- throw new Exception('The pattern for month '.
- 'is "M", "MM", "MMM", or "MMMM".');
- }
- }
-
- /**
- * Get the day of the week.
- * "E" will return integer 0 (for Sunday) through 6 (for Saturday).
- * "EE" will return the narrow day of the week, e.g. "M"
- * "EEE" will return the abrreviated day of the week, e.g. "Mon"
- * "EEEE" will return the day of the week, e.g. "Monday"
- * @param array getdate format.
- * @param string a pattern.
- * @return string day of the week.
- */
- protected function getDayInWeek($date, $pattern='EEEE')
- {
- $day = $date['wday'];
-
- switch($pattern)
- {
- case 'E':
- return $day;
- break;
- case 'EE':
- return $this->formatInfo->NarrowDayNames[$day];
- case 'EEE':
- return $this->formatInfo->AbbreviatedDayNames[$day];
- break;
- case 'EEEE':
- return $this->formatInfo->DayNames[$day];
- break;
- default:
- throw new Exception('The pattern for day of the week '.
- 'is "E", "EE", "EEE", or "EEEE".');
- }
- }
-
- /**
- * Get the day of the month.
- * "d" for non-padding, "dd" will always return 2 characters.
- * @param array getdate format.
- * @param string a pattern.
- * @return string day of the month
- */
- protected function getDay($date, $pattern='d')
- {
- $day = $date['mday'];
-
- switch($pattern)
- {
- case 'd':
- return $day;
- case 'dd':
- return str_pad($day, 2,'0',STR_PAD_LEFT);
- default:
- throw new Exception('The pattern for day of '.
- 'the month is "d" or "dd".');
- }
- }
-
-
- /**
- * Get the era. i.e. in gregorian, year > 0 is AD, else BC.
- * @todo How to support multiple Eras?, e.g. Japanese.
- * @param array getdate format.
- * @param string a pattern.
- * @return string era
- */
- protected function getEra($date, $pattern='G')
- {
-
- if($pattern != 'G')
- throw new Exception('The pattern for era is "G".');
-
- $year = $date['year'];
- if($year > 0)
- return $this->formatInfo->getEra(1);
- else
- return $this->formatInfo->getEra(0);
- }
-
- /**
- * Get the hours in 24 hour format, i.e. [0-23].
- * "H" for non-padding, "HH" will always return 2 characters.
- * @param array getdate format.
- * @param string a pattern.
- * @return string hours in 24 hour format.
- */
- protected function getHour24($date, $pattern='H')
- {
- $hour = $date['hours'];
-
- switch($pattern)
- {
- case 'H':
- return $hour;
- case 'HH':
- return str_pad($hour, 2,'0',STR_PAD_LEFT);
- default:
- throw new Exception('The pattern for 24 hour '.
- 'format is "H" or "HH".');
- }
- }
-
- /**
- * Get the AM/PM designator, 12 noon is PM, 12 midnight is AM.
- * @param array getdate format.
- * @param string a pattern.
- * @return string AM or PM designator
- */
- protected function getAMPM($date, $pattern='a')
- {
- if($pattern != 'a')
- throw new Exception('The pattern for AM/PM marker is "a".');
-
- $hour = $date['hours'];
- $ampm = (int)($hour/12);
- return $this->formatInfo->AMPMMarkers[$ampm];
- }
-
- /**
- * Get the hours in 12 hour format.
- * "h" for non-padding, "hh" will always return 2 characters.
- * @param array getdate format.
- * @param string a pattern.
- * @return string hours in 12 hour format.
- */
- protected function getHour12($date, $pattern='h')
- {
- $hour = $date['hours'];
- $hour = ($hour==12|$hour==0)?12:($hour)%12;
-
- switch($pattern)
- {
- case 'h':
- return $hour;
- case 'hh':
- return str_pad($hour, 2,'0',STR_PAD_LEFT);
- default:
- throw new Exception('The pattern for 24 hour '.
- 'format is "H" or "HH".');
- }
- }
-
- /**
- * Get the minutes.
- * "m" for non-padding, "mm" will always return 2 characters.
- * @param array getdate format.
- * @param string a pattern.
- * @return string minutes.
- */
- protected function getMinutes($date, $pattern='m')
- {
- $minutes = $date['minutes'];
-
- switch($pattern)
- {
- case 'm':
- return $minutes;
- case 'mm':
- return str_pad($minutes, 2,'0',STR_PAD_LEFT);
- default:
- throw new Exception('The pattern for minutes is "m" or "mm".');
- }
- }
-
- /**
- * Get the seconds.
- * "s" for non-padding, "ss" will always return 2 characters.
- * @param array getdate format.
- * @param string a pattern.
- * @return string seconds
- */
- protected function getSeconds($date, $pattern='s')
- {
- $seconds = $date['seconds'];
-
- switch($pattern)
- {
- case 's':
- return $seconds;
- case 'ss':
- return str_pad($seconds, 2,'0',STR_PAD_LEFT);
- default:
- throw new Exception('The pattern for seconds is "s" or "ss".');
- }
- }
-
- /**
- * Get the timezone from the server machine.
- * @todo How to get the timezone for a different region?
- * @param array getdate format.
- * @param string a pattern.
- * @return string time zone
- */
- protected function getTimeZone($date, $pattern='z')
- {
- if($pattern != 'z')
- throw new Exception('The pattern for time zone is "z".');
-
- return @date('T', @mktime($date['hours'], $date['minutes'], $date['seconds'], $date['mon'], $date['mday'], $date['year']));
- }
-
- /**
- * Get the day in the year, e.g. [1-366]
- * @param array getdate format.
- * @param string a pattern.
- * @return int hours in AM/PM format.
- */
- protected function getDayInYear($date, $pattern='D')
- {
- if($pattern != 'D')
- throw new Exception('The pattern for day in year is "D".');
-
- return $date['yday'];
- }
-
- /**
- * Get day in the month.
- * @param array getdate format.
- * @param string a pattern.
- * @return int day in month
- */
- protected function getDayInMonth($date, $pattern='FF')
- {
- switch ($pattern) {
- case 'F':
- return @date('j', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
- break;
- case 'FF':
- return @date('d', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
- break;
- default:
- throw new Exception('The pattern for day in month is "F" or "FF".');
- }
- }
-
- /**
- * Get the week in the year.
- * @param array getdate format.
- * @param string a pattern.
- * @return int week in year
- */
- protected function getWeekInYear($date, $pattern='w')
- {
- if($pattern != 'w')
- throw new Exception('The pattern for week in year is "w".');
-
- return @date('W', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
- }
-
- /**
- * Get week in the month.
- * @param array getdate format.
- * @return int week in month
- */
- protected function getWeekInMonth($date, $pattern='W')
- {
- if($pattern != 'W')
- throw new Exception('The pattern for week in month is "W".');
-
- return @date('W', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year'])) - date('W', mktime(0, 0, 0, $date['mon'], 1, $date['year']));
- }
-
- /**
- * Get the hours [1-24].
- * @param array getdate format.
- * @param string a pattern.
- * @return int hours [1-24]
- */
- protected function getHourInDay($date, $pattern='k')
- {
- if($pattern != 'k')
- throw new Exception('The pattern for hour in day is "k".');
-
- return $date['hours']+1;
- }
-
- /**
- * Get the hours in AM/PM format, e.g [1-12]
- * @param array getdate format.
- * @param string a pattern.
- * @return int hours in AM/PM format.
- */
- protected function getHourInAMPM($date, $pattern='K')
- {
- if($pattern != 'K')
- throw new Exception('The pattern for hour in AM/PM is "K".');
-
- return ($date['hours']+1)%12;
- }
-
-}
-
-?>
+<?php
+/**
+ * DateFormat class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Revision: 1.8 $ $Date: 2005/12/15 07:14:49 $
+ * @package System.I18N.core
+ */
+
+/**
+ * Get the DateTimeFormatInfo class.
+ */
+require_once(dirname(__FILE__).'/DateTimeFormatInfo.php');
+
+/**
+ * Get the encoding utilities
+ */
+require_once(dirname(__FILE__).'/util.php');
+
+/**
+ * DateFormat class.
+ *
+ * The DateFormat class allows you to format dates and times with
+ * predefined styles in a locale-sensitive manner. Formatting times
+ * with the DateFormat class is similar to formatting dates.
+ *
+ * Formatting dates with the DateFormat class is a two-step process.
+ * First, you create a formatter with the getDateInstance method.
+ * Second, you invoke the format method, which returns a string containing
+ * the formatted date.
+ *
+ * DateTime values are formatted using standard or custom patterns stored
+ * in the properties of a DateTimeFormatInfo.
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Sat Dec 04 14:10:49 EST 2004
+ * @package System.I18N.core
+ */
+class DateFormat
+{
+ /**
+ * A list of tokens and their function call.
+ * @var array
+ */
+ protected $tokens = array(
+ 'G'=>'Era',
+ 'y'=>'Year',
+ 'M'=>'Month',
+ 'd'=>'Day',
+ 'h'=>'Hour12',
+ 'H'=>'Hour24',
+ 'm'=>'Minutes',
+ 's'=>'Seconds',
+ 'E'=>'DayInWeek',
+ 'D'=>'DayInYear',
+ 'F'=>'DayInMonth',
+ 'w'=>'WeekInYear',
+ 'W'=>'WeekInMonth',
+ 'a'=>'AMPM',
+ 'k'=>'HourInDay',
+ 'K'=>'HourInAMPM',
+ 'z'=>'TimeZone'
+ );
+
+ /**
+ * A list of methods, to be used by the token function calls.
+ * @var array
+ */
+ protected $methods = array();
+
+ /**
+ * The DateTimeFormatInfo, containing culture specific patterns and names.
+ * @var DateTimeFormatInfo
+ */
+ protected $formatInfo;
+
+ /**
+ * Initialize a new DateFormat.
+ * @param mixed either, null, a CultureInfo instance,
+ * a DateTimeFormatInfo instance, or a locale.
+ * @return DateFormat instance
+ */
+ function __construct($formatInfo=null)
+ {
+ if($formatInfo === null)
+ $this->formatInfo = DateTimeFormatInfo::getInvariantInfo();
+ else if($formatInfo instanceof CultureInfo)
+ $this->formatInfo = $formatInfo->DateTimeFormat;
+ else if($formatInfo instanceof DateTimeFormatInfo)
+ $this->formatInfo = $formatInfo;
+ else
+ $this->formatInfo = DateTimeFormatInfo::getInstance($formatInfo);
+
+ $this->methods = get_class_methods($this);
+ }
+
+ /**
+ * Format a date according to the pattern.
+ * @param mixed the time as integer or string in strtotime format.
+ * @return string formatted date time.
+ */
+ public function format($time, $pattern='F', $charset='UTF-8')
+ {
+ if (is_numeric($time)) //assumes unix epoch
+ $time = floatval($time);
+ else if(is_string($time))
+ $time = @strtotime($time);
+
+ if($pattern === null)
+ $pattern = 'F';
+
+ $s = Prado::createComponent('System.Util.TDateTimeStamp');
+
+ $date = $s->getDate($time);
+
+ $pattern = $this->getPattern($pattern);
+
+ $tokens = $this->getTokens($pattern);
+
+ for($i = 0, $k = count($tokens); $i<$k; ++$i)
+ {
+ $pattern = $tokens[$i];
+ if($pattern{0} == "'"
+ && $pattern{strlen($pattern)-1} == "'")
+ {
+ $sub = preg_replace('/(^\')|(\'$)/','',$pattern);
+ $tokens[$i] = str_replace('``````','\'',$sub);
+ }
+ else if($pattern == '``````')
+ {
+ $tokens[$i] = '\'';
+ }
+ else
+ {
+ $function = $this->getFunctionName($pattern);
+ if($function != null)
+ {
+ $fName = 'get'.$function;
+ if(in_array($fName, $this->methods))
+ {
+ $rs = $this->$fName($date, $pattern);
+ $tokens[$i] = $rs;
+ }
+ else
+ throw new
+ Exception('function '.$function.' not found.');
+ }
+ }
+ }
+
+ return I18N_toEncoding(implode('',$tokens), $charset);
+ }
+
+ /**
+ * For a particular token, get the corresponding function to call.
+ * @param string token
+ * @return mixed the function if good token, null otherwise.
+ */
+ protected function getFunctionName($token)
+ {
+ if(isset($this->tokens[$token{0}]))
+ return $this->tokens[$token{0}];
+ }
+
+ /**
+ * Get the pattern from DateTimeFormatInfo or some predefined patterns.
+ * If the $pattern parameter is an array of 2 element, it will assume
+ * that the first element is the date, and second the time
+ * and try to find an appropriate pattern and apply
+ * DateTimeFormatInfo::formatDateTime
+ * See the tutorial documentation for futher details on the patterns.
+ * @param mixed a pattern.
+ * @return string a pattern.
+ * @see DateTimeFormatInfo::formatDateTime()
+ */
+ protected function getPattern($pattern)
+ {
+ if(is_array($pattern) && count($pattern) == 2)
+ {
+ return $this->formatInfo->formatDateTime(
+ $this->getPattern($pattern[0]),
+ $this->getPattern($pattern[1]));
+ }
+
+ switch($pattern)
+ {
+ case 'd':
+ return $this->formatInfo->ShortDatePattern;
+ break;
+ case 'D':
+ return $this->formatInfo->LongDatePattern;
+ break;
+ case 'p':
+ return $this->formatInfo->MediumDatePattern;
+ break;
+ case 'P':
+ return $this->formatInfo->FullDatePattern;
+ break;
+ case 't':
+ return $this->formatInfo->ShortTimePattern;
+ break;
+ case 'T':
+ return $this->formatInfo->LongTimePattern;
+ break;
+ case 'q':
+ return $this->formatInfo->MediumTimePattern;
+ break;
+ case 'Q':
+ return $this->formatInfo->FullTimePattern;
+ break;
+ case 'f':
+ return $this->formatInfo->formatDateTime(
+ $this->formatInfo->LongDatePattern,
+ $this->formatInfo->ShortTimePattern);
+ break;
+ case 'F':
+ return $this->formatInfo->formatDateTime(
+ $this->formatInfo->LongDatePattern,
+ $this->formatInfo->LongTimePattern);
+ break;
+ case 'g':
+ return $this->formatInfo->formatDateTime(
+ $this->formatInfo->ShortDatePattern,
+ $this->formatInfo->ShortTimePattern);
+ break;
+ case 'G':
+ return $this->formatInfo->formatDateTime(
+ $this->formatInfo->ShortDatePattern,
+ $this->formatInfo->LongTimePattern);
+ break;
+ case 'M':
+ case 'm':
+ return 'MMMM dd';
+ break;
+ case 'R':
+ case 'r':
+ return 'EEE, dd MMM yyyy HH:mm:ss';
+ break;
+ case 's':
+ return 'yyyy-MM-ddTHH:mm:ss';
+ break;
+ case 'u':
+ return 'yyyy-MM-dd HH:mm:ss z';
+ break;
+ case 'U':
+ return 'EEEE dd MMMM yyyy HH:mm:ss';
+ break;
+ case 'Y':
+ case 'y':
+ return 'yyyy MMMM';
+ break;
+ default :
+ return $pattern;
+ }
+ }
+
+ /**
+ * Tokenize the pattern. The tokens are delimited by group of
+ * similar characters, e.g. 'aabb' will form 2 tokens of 'aa' and 'bb'.
+ * Any substrings, starting and ending with a single quote (')
+ * will be treated as a single token.
+ * @param string pattern.
+ * @return array string tokens in an array.
+ */
+ protected function getTokens($pattern)
+ {
+ $char = null;
+ $tokens = array();
+ $token = null;
+
+ $text = false;
+ $pattern = preg_replace("/''/", '``````', $pattern);
+
+ for($i = 0; $i < strlen($pattern); $i++)
+ {
+ if($char==null || $pattern{$i} == $char || $text)
+ {
+ $token .= $pattern{$i};
+ }
+ else
+ {
+ $tokens[] = str_replace("","'",$token);
+ $token = $pattern{$i};
+ }
+
+ if($pattern{$i} == "'" && $text == false)
+ $text = true;
+ else if($text && $pattern{$i} == "'" && $char == "'")
+ $text = true;
+ else if($text && $char != "'" && $pattern{$i} == "'")
+ $text = false;
+
+ $char = $pattern{$i};
+
+ }
+ $tokens[] = $token;
+ return $tokens;
+ }
+
+ /**
+ * Get the year.
+ * "yy" will return the last two digits of year.
+ * "yyyy" will return the full integer year.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string year
+ */
+ protected function getYear($date, $pattern='yyyy')
+ {
+ $year = $date['year'];
+ switch($pattern)
+ {
+ case 'yy':
+ return substr($year,2);
+ case 'yyyy':
+ return $year;
+ default:
+ throw new Exception('The pattern for year is either "yy" or "yyyy".');
+ }
+ }
+
+ /**
+ * Get the month.
+ * "M" will return integer 1 through 12
+ * "MM" will return the narrow month name, e.g. "J"
+ * "MMM" will return the abrreviated month name, e.g. "Jan"
+ * "MMMM" will return the month name, e.g. "January"
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string month name
+ */
+ protected function getMonth($date, $pattern='M')
+ {
+ $month = $date['mon'];
+
+ switch($pattern)
+ {
+ case 'M':
+ return $month;
+ case 'MM':
+ return str_pad($month, 2,'0',STR_PAD_LEFT);
+ case 'MMM':
+ return $this->formatInfo->AbbreviatedMonthNames[$month-1];
+ break;
+ case 'MMMM':
+ return $this->formatInfo->MonthNames[$month-1];
+ default:
+ throw new Exception('The pattern for month '.
+ 'is "M", "MM", "MMM", or "MMMM".');
+ }
+ }
+
+ /**
+ * Get the day of the week.
+ * "E" will return integer 0 (for Sunday) through 6 (for Saturday).
+ * "EE" will return the narrow day of the week, e.g. "M"
+ * "EEE" will return the abrreviated day of the week, e.g. "Mon"
+ * "EEEE" will return the day of the week, e.g. "Monday"
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string day of the week.
+ */
+ protected function getDayInWeek($date, $pattern='EEEE')
+ {
+ $day = $date['wday'];
+
+ switch($pattern)
+ {
+ case 'E':
+ return $day;
+ break;
+ case 'EE':
+ return $this->formatInfo->NarrowDayNames[$day];
+ case 'EEE':
+ return $this->formatInfo->AbbreviatedDayNames[$day];
+ break;
+ case 'EEEE':
+ return $this->formatInfo->DayNames[$day];
+ break;
+ default:
+ throw new Exception('The pattern for day of the week '.
+ 'is "E", "EE", "EEE", or "EEEE".');
+ }
+ }
+
+ /**
+ * Get the day of the month.
+ * "d" for non-padding, "dd" will always return 2 characters.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string day of the month
+ */
+ protected function getDay($date, $pattern='d')
+ {
+ $day = $date['mday'];
+
+ switch($pattern)
+ {
+ case 'd':
+ return $day;
+ case 'dd':
+ return str_pad($day, 2,'0',STR_PAD_LEFT);
+ default:
+ throw new Exception('The pattern for day of '.
+ 'the month is "d" or "dd".');
+ }
+ }
+
+
+ /**
+ * Get the era. i.e. in gregorian, year > 0 is AD, else BC.
+ * @todo How to support multiple Eras?, e.g. Japanese.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string era
+ */
+ protected function getEra($date, $pattern='G')
+ {
+
+ if($pattern != 'G')
+ throw new Exception('The pattern for era is "G".');
+
+ $year = $date['year'];
+ if($year > 0)
+ return $this->formatInfo->getEra(1);
+ else
+ return $this->formatInfo->getEra(0);
+ }
+
+ /**
+ * Get the hours in 24 hour format, i.e. [0-23].
+ * "H" for non-padding, "HH" will always return 2 characters.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string hours in 24 hour format.
+ */
+ protected function getHour24($date, $pattern='H')
+ {
+ $hour = $date['hours'];
+
+ switch($pattern)
+ {
+ case 'H':
+ return $hour;
+ case 'HH':
+ return str_pad($hour, 2,'0',STR_PAD_LEFT);
+ default:
+ throw new Exception('The pattern for 24 hour '.
+ 'format is "H" or "HH".');
+ }
+ }
+
+ /**
+ * Get the AM/PM designator, 12 noon is PM, 12 midnight is AM.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string AM or PM designator
+ */
+ protected function getAMPM($date, $pattern='a')
+ {
+ if($pattern != 'a')
+ throw new Exception('The pattern for AM/PM marker is "a".');
+
+ $hour = $date['hours'];
+ $ampm = (int)($hour/12);
+ return $this->formatInfo->AMPMMarkers[$ampm];
+ }
+
+ /**
+ * Get the hours in 12 hour format.
+ * "h" for non-padding, "hh" will always return 2 characters.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string hours in 12 hour format.
+ */
+ protected function getHour12($date, $pattern='h')
+ {
+ $hour = $date['hours'];
+ $hour = ($hour==12|$hour==0)?12:($hour)%12;
+
+ switch($pattern)
+ {
+ case 'h':
+ return $hour;
+ case 'hh':
+ return str_pad($hour, 2,'0',STR_PAD_LEFT);
+ default:
+ throw new Exception('The pattern for 24 hour '.
+ 'format is "H" or "HH".');
+ }
+ }
+
+ /**
+ * Get the minutes.
+ * "m" for non-padding, "mm" will always return 2 characters.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string minutes.
+ */
+ protected function getMinutes($date, $pattern='m')
+ {
+ $minutes = $date['minutes'];
+
+ switch($pattern)
+ {
+ case 'm':
+ return $minutes;
+ case 'mm':
+ return str_pad($minutes, 2,'0',STR_PAD_LEFT);
+ default:
+ throw new Exception('The pattern for minutes is "m" or "mm".');
+ }
+ }
+
+ /**
+ * Get the seconds.
+ * "s" for non-padding, "ss" will always return 2 characters.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string seconds
+ */
+ protected function getSeconds($date, $pattern='s')
+ {
+ $seconds = $date['seconds'];
+
+ switch($pattern)
+ {
+ case 's':
+ return $seconds;
+ case 'ss':
+ return str_pad($seconds, 2,'0',STR_PAD_LEFT);
+ default:
+ throw new Exception('The pattern for seconds is "s" or "ss".');
+ }
+ }
+
+ /**
+ * Get the timezone from the server machine.
+ * @todo How to get the timezone for a different region?
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return string time zone
+ */
+ protected function getTimeZone($date, $pattern='z')
+ {
+ if($pattern != 'z')
+ throw new Exception('The pattern for time zone is "z".');
+
+ return @date('T', @mktime($date['hours'], $date['minutes'], $date['seconds'], $date['mon'], $date['mday'], $date['year']));
+ }
+
+ /**
+ * Get the day in the year, e.g. [1-366]
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return int hours in AM/PM format.
+ */
+ protected function getDayInYear($date, $pattern='D')
+ {
+ if($pattern != 'D')
+ throw new Exception('The pattern for day in year is "D".');
+
+ return $date['yday'];
+ }
+
+ /**
+ * Get day in the month.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return int day in month
+ */
+ protected function getDayInMonth($date, $pattern='FF')
+ {
+ switch ($pattern) {
+ case 'F':
+ return @date('j', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
+ break;
+ case 'FF':
+ return @date('d', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
+ break;
+ default:
+ throw new Exception('The pattern for day in month is "F" or "FF".');
+ }
+ }
+
+ /**
+ * Get the week in the year.
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return int week in year
+ */
+ protected function getWeekInYear($date, $pattern='w')
+ {
+ if($pattern != 'w')
+ throw new Exception('The pattern for week in year is "w".');
+
+ return @date('W', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
+ }
+
+ /**
+ * Get week in the month.
+ * @param array getdate format.
+ * @return int week in month
+ */
+ protected function getWeekInMonth($date, $pattern='W')
+ {
+ if($pattern != 'W')
+ throw new Exception('The pattern for week in month is "W".');
+
+ return @date('W', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year'])) - date('W', mktime(0, 0, 0, $date['mon'], 1, $date['year']));
+ }
+
+ /**
+ * Get the hours [1-24].
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return int hours [1-24]
+ */
+ protected function getHourInDay($date, $pattern='k')
+ {
+ if($pattern != 'k')
+ throw new Exception('The pattern for hour in day is "k".');
+
+ return $date['hours']+1;
+ }
+
+ /**
+ * Get the hours in AM/PM format, e.g [1-12]
+ * @param array getdate format.
+ * @param string a pattern.
+ * @return int hours in AM/PM format.
+ */
+ protected function getHourInAMPM($date, $pattern='K')
+ {
+ if($pattern != 'K')
+ throw new Exception('The pattern for hour in AM/PM is "K".');
+
+ return ($date['hours']+1)%12;
+ }
+
+}
+
+?>